我有一个这样的数据框:
date message
05/01/2017 field1=aaaa&field2=bbbb&field3=cccc
05/02/2017 field1=aaaa&field2=bbbb&field3=cccc
我想像这样改造它:
date field1 field2 field3
05/01/2017 aaaa bbbb cccc
05/02/2017 aaaa bbbb cccc
但我无法做到。 这是我的代码,直到现在:
def split_log_fields(x):
date = x[0]
subscription = x[2][x[2].index('=')+1:]
user_id = x[3][x[3].index('=')+1:]
status = x[4][x[4].index('=')+1:]
return [[date],[subscription],[user_id],[status]]
a = pandas.read_csv(WEBPUSH_SUBSCRIBERS_FILE_NAME,sep='#',header=None)
b= a[1].str.split('&', 2,expand=True)
c = pandas.concat([a,b], axis=1, ignore_index=True)
d = c.apply(split_log_fields,axis=1).to_frame()
问题是d没有被正确的字段分隔。 d现在是这样的:
field
[[05/01/2017], [aaaa],[bbbb],[cccc]]
Pandas没有拆分不同字段中的列表列表。
我该如何解决这个问题?
答案 0 :(得分:1)
由于消息似乎来自HTTP查询字符串,因此解析它们的最可靠方法是使用HTTP解析器。这自然会保留键/值对:
from urllib.parse import parse_qs
pd.concat([df, df.message.apply(parse_qs).apply(pd.Series)], axis=1)
# date message field1 field2 field3
#0 05/01/2017 field1=aaaa&field2=bbbb&field3=cccc [aaaa] [bbbb] [cccc]
#1 05/02/2017 field1=aaaa&field2=bbbb&field3=cccc [aaaa] [bbbb] [cccc]
答案 1 :(得分:1)
您可以使用str.extract
df[['f1', 'f2', 'f3']] = df['message'].str.extract('=(\w+)&.*=(\w+)&.*=(\w+)', expand = True)
你得到了
date message f1 f2 f3
0 05/01/2017 field1=aaaa&field2=bbbb&field3=cccc aaaa bbbb cccc
1 05/02/2017 field1=aaaa&field2=bbbb&field3=cccc aaaa bbbb cccc
如果要删除原始列消息,
df.drop('message', axis =1, inplace = True)
编辑: 使用str.split
df[['f1', 'f2', 'f3']] = df['message'].str.split('&', expand = True).replace({'.*=':''}, regex = True)
你得到相同的结果