例如,我有一个这样的文件
all info in 1 column
<表类>
头
公司
价格数据 tbody><<tr>1 做 2南 3 comp1文件 4南 5价格:222 6结果:好的,22.05.19 7南 8做 9 南 10comp2 11南 12 价格:2895 13结果:不,15.05.19 14南 15 做 16 和ctr 表类>
最好是从一开始就正确导入数据。
也就是说,主要是为了好玩,您可以使用regex和重塑来修复此格式:
# remove NaNs, and "done" rows
s = df['header'].loc[df['header'].ne('done')].dropna()
# extract the Price/Result/Date
pattern = r'price:(?P<Price>d+)|result:(?P<Result>w+), (?P<Date>[d.]+)'
df2 = s.str.extract(pattern)
# identify potential company names
m = df2.isna().all(axis=1)
# reshape
out = (df2
.assign(Company=s.where(m))
.set_index(m.cumsum(), append=True)
.droplevel(0)
.stack().unstack()
.dropna(subset=['Price', 'Result', 'Date'], how='all')
)
输出:
Price Result Date Company
1 222 ok 22.05.19 comp1
2 2895 no 15.05.19 comp2
这是mozway的好主意。
data = ['done', None, 'comp1', None, 'price:222', 'result:ok, 22.05.19', None,
'done', None, 'comp2', None, 'price:2895','result:no, 15.05.19', None, 'done']
df = pd.DataFrame(data, columns=['header'])
df
header
0 done
1 None
2 comp1
3 None
4 price:222
5 result:ok, 22.05.19
6 None
7 done
8 None
9 comp2
10 None
11 price:2895
12 result:no, 15.05.19
13 None
14 done
代码pattern = r'(?P<Company>compd)|price:(?P<Price>d+)|result:(?P<Result>w+), (?P<Date>[d.]+)'
grouper = df['header'].str.contains('^comp').cumsum()
out = (df['header'].str.extract(pattern).groupby(grouper).first()
.dropna(subset=['Company']).set_index('Company'))
out
Price Result Date
Company
comp1 222 ok 22.05.19
comp2 2895 no 15.05.19
我可以看到公司,状态,日期,位置有模式与价格。如果它与您的实际数据相同,您可以这样做:
输入:
df = pd.DataFrame({'header':['done', None, 'comp1', None, 'price:222', 'result:ok, 22.05.19', None, 'Done', None,
'comp2', None, 'price:2895', 'result:no, 15.05.19', None, 'Done', 'and ctr'],'Company':None, 'price':None, 'data':None})
代码:
ls=list(df.header.str.split(':'))
pd.DataFrame([{'Company':ls[i-2][0], 'price': v[1], 'result': ls[i+1][1].split(',')[0], 'date':ls[i+1][1].split(',')[1]}
for i, v in enumerate(ls) if 'price'in str(v)])
输出:
Company price result date
0 comp1 222 ok 22.05.19
1 comp2 2895 no 15.05.19