【问题标题】:Split list of lists in various fields of pandas data framepandas 数据框各个字段的列表拆分列表
【发布时间】:2017-05-04 01:06:43
【问题描述】:

我有一个这样的数据框:

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 不会在不同字段中拆分列表。

我该如何解决这个问题?

【问题讨论】:

标签: python pandas


【解决方案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)

你得到相同的结果

【讨论】:

    【解决方案2】:

    由于消息似乎来自 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 2016-10-13
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多