我如何创建一个函数来分析1列中行中的文本并在其他列中重写



例如,我有一个这样的文件

all info in 1 column

<表类> 头 公司 价格数据tbody><<tr>1做2南3comp1文件4南5价格:2226结果:好的,22.05.197南8做9南10comp211南12价格:289513结果:不,15.05.1914南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

最新更新