pandas 我怎样才能创建一个函数,分析文本行1列和重写在其他人

cvxl0en2  于 2022-12-16  发布在  其他
关注(0)|答案(3)|浏览(109)

例如-我有这样的smth
1栏中的所有信息
| | 集管|公司|价格|资料|
| - ------|- ------|- ------|- ------|- ------|
| 1个|完成||||
| 第二章|楠||||
| 三个|部件1||||
| 四个|楠||||
| 五个|售价:二百二十二元||||
| 六个|结果:良好,2019年5月22日||||
| 七|楠||||
| 八个|完成||||
| 九|楠||||
| 十个|组分2||||
| 十一|楠||||
| 十二|售价:2895||||
| 十三|结果:否,2019年5月15日||||
| 十四|楠||||
| 十五|完成||||
| 十六|和CTR||||
我试图找到OT如何创建一个函数,将信息放在其他列的正确结果标题1
| 努姆|公司|价格|结果|日期|
| - ------|- ------|- ---------------------------------------------------|- ------|- ------|
| 1个|组分1|二百二十二|好的|2019年5月22日|
| 第二章|组分2|小行星2895|没有|2019年5月15日|
| 等等|||||

w8biq8rn

w8biq8rn1#

最好的办法可能是从一开始就正确导入数据。
也就是说,主要是为了好玩,您可以使用正则表达式和整形来修复这种格式:

# 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
368yc8dk

368yc8dk2#

这是用莫兹韦的好主意做出的回答。

示例

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>comp\d)|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
yrwegjxp

yrwegjxp3#

我可以看到公司,状态,日期位置与价格的模式。如果它与您的实际数据相同,您可以做如下:
输入:

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

相关问题