【问题标题】:Split pandas dataframe nested list into new named columns将熊猫数据框嵌套列表拆分为新的命名列
【发布时间】:2015-09-18 14:56:18
【问题描述】:

我有一个如下形式的数据框 (df):

name alias col3
mark david ['3109892828','email@john.com','123 main st']
john twixt ['5468392873','email@twix.com','345 grand st']

将 col3 拆分为新的命名列的简洁方法是什么? (也许使用 lambda 并应用)

【问题讨论】:

    标签: python list pandas


    【解决方案1】:

    您可以对列表元素应用连接以生成逗号分隔的字符串,然后使用expand=True 调用矢量化的str.split 来创建新列:

    In [12]:
    df[['UserID', 'email', 'address']] = df['col3'].apply(','.join).str.split(expand=True)
    df
    
    Out[12]:
       alias                                        col3  name  \
    0  david   [3109892828, email@john.com, 123 main st]  mark   
    1  twixt  [5468392873, email@twix.com, 345 grand st]  john   
    
                              UserID  email address  
    0  3109892828,email@john.com,123   main      st  
    1  5468392873,email@twix.com,345  grand      st
    

    更简洁的方法是应用 pd.Series ctor,它将每个列表变成一个系列:

    In [15]:
    df[['UserID', 'email', 'address']] = df['col3'].apply(pd.Series)
    df
    
    Out[15]:
       alias                                        col3  name      UserID  \
    0  david   [3109892828, email@john.com, 123 main st]  mark  3109892828   
    1  twixt  [5468392873, email@twix.com, 345 grand st]  john  5468392873   
    
                email       address  
    0  email@john.com   123 main st  
    1  email@twix.com  345 grand st  
    

    【讨论】:

    • 如果“列”合法地包含逗号,这可能会导致困难......也许像 df[['id', 'email', 'address']] = df.col3.apply(pd.Series) 然后删除 col3
    • 嗯。是的,但除非 OP 在他们的数据中有这个,否则我不认为这是一个问题,仍然应用 Series ctor 更干净,在这里足够了,会更新,谢谢
    • 通常,这将是一个很好的解决方案,但似乎我的数组每行的列数不同.. 如果嵌套列表的列数不同,我该怎么办每条记录的字段数?这是我得到的错误: ValueError: Columns must be same length as key
    • 这是我在使用 split() 时遇到的错误:TypeError: split() got an unexpected keyword argument 'expand'
    • 如果元素数量不一致,那么除非长度相同,否则您无法创建新列,您使用的是什么版本的熊猫?
    【解决方案2】:

    这就是我想出的。它包括对原始文件的一些清理,以及到字典的转换。

    import pandas as pd
    with open('/path/to/file', 'rb') as f:
        data = f.readlines()
    
    data = map(lambda x: x.split('}'), data)
    data_df = pd.DataFrame(data)
    data_dfn = data_df.transpose()
    data_new = data_dfn[0].map(lambda x: x.lstrip('[,{)').replace("'","").split(','))
    
    s = pd.DataFrame(data_new)
    d = dict(data_new)
    D = pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in d.iteritems() ]))
    D = D.transpose()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-26
      • 2018-12-04
      • 1970-01-01
      • 2021-07-27
      • 2023-02-03
      • 2020-08-13
      • 1970-01-01
      • 2021-02-03
      相关资源
      最近更新 更多