【问题标题】:parsing a dictionary in a pandas dataframe cell into new row cells (new columns)将熊猫数据框单元格中的字典解析为新行单元格(新列)
【发布时间】:2017-01-31 03:26:21
【问题描述】:

我有一个 Pandas 数据框,其中包含一列,其中包含包含键值对字典的单元格,如下所示:

{"name":"Test Thorton","company":"Test Group","address":"10850 Test #325\r\n","city":"Test City","state_province":"CA","postal_code":"95670","country":"USA","email_address":"test@testtest.com","phone_number":"999-888-3333","equipment_description":"I'm a big red truck\r\n\r\nRSN# 0000","response_desired":"week","response_method":"email"}

我正在尝试解析字典,因此生成的 Dataframe 包含每个键的新列,并且该行填充了每列的结果值,如下所示:

//Before

1  2  3  4  5
a  b  c  d  {6:y, 7:v}

//After

1  2  3  4  5           6  7
a  b  c  d  {6:y, 7:v}  y  v

非常感谢您的建议。

【问题讨论】:

    标签: python pandas dictionary append multiple-columns


    【解决方案1】:

    考虑df

    df = pd.DataFrame([
            ['a', 'b', 'c', 'd', dict(F='y', G='v')],
            ['a', 'b', 'c', 'd', dict(F='y', G='v')],
        ], columns=list('ABCDE'))
    
    df
    
       A  B  C  D                     E
    0  a  b  c  d  {'F': 'y', 'G': 'v'}
    1  a  b  c  d  {'F': 'y', 'G': 'v'}
    

    选项 1
    使用pd.Series.apply,就地分配新列

    df.E.apply(pd.Series)
    
       F  G
    0  y  v
    1  y  v
    

    这样分配

    df[['F', 'G']] = df.E.apply(pd.Series)
    df.drop('E', axis=1)
    
       A  B  C  D  F  G
    0  a  b  c  d  y  v
    1  a  b  c  d  y  v
    

    选项 2
    使用pd.DataFrame.assign 方法流水线化整个过程

    df.drop('E', 1).assign(**pd.DataFrame(df.E.values.tolist()))
    
       A  B  C  D  F  G
    0  a  b  c  d  y  v
    1  a  b  c  d  y  v
    

    【讨论】:

    • 我喜欢选项 1 ❤️。谢谢你,先生!
    • 选项 2 为我节省了很多小时的挫败感。 apply(pd.Series) 甚至不是大数据的选项
    【解决方案2】:

    我觉得你可以用concat:

    df = pd.DataFrame({1:['a','h'],2:['b','h'], 5:[{6:'y', 7:'v'},{6:'u', 7:'t'}] })
    
    print (df)
       1  2                 5
    0  a  b  {6: 'y', 7: 'v'}
    1  h  h  {6: 'u', 7: 't'}
    
    print (df.loc[:,5].values.tolist())
    [{6: 'y', 7: 'v'}, {6: 'u', 7: 't'}]
    
    df1 = pd.DataFrame(df.loc[:,5].values.tolist())
    print (df1)
       6  7
    0  y  v
    1  u  t
    
    print (pd.concat([df, df1], axis=1))
       1  2                 5  6  7
    0  a  b  {6: 'y', 7: 'v'}  y  v
    1  h  h  {6: 'u', 7: 't'}  u  t
    

    时间安排 (len(df)=2k):

    In [2]: %timeit (pd.concat([df, pd.DataFrame(df.loc[:,5].values.tolist())], axis=1))
    100 loops, best of 3: 2.99 ms per loop
    
    In [3]: %timeit (pir(df))
    1 loop, best of 3: 625 ms per loop
    
    df = pd.concat([df]*1000).reset_index(drop=True)
    
    print (pd.concat([df, pd.DataFrame(df.loc[:,5].values.tolist())], axis=1))
    
    
    def pir(df):
        df[['F', 'G']] = df[5].apply(pd.Series)
        df.drop(5, axis=1)
        return df
    
    print (pir(df))    
    

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2021-08-16
      • 2018-01-24
      • 2021-08-07
      • 2018-11-16
      • 2020-09-26
      相关资源
      最近更新 更多