【问题标题】:At a dataframe how to explode a column with a list (with same length at all rows) into different columns at the same row在数据框中,如何将带有列表的列(所有行的长度相同)分解为同一行的不同列
【发布时间】:2020-08-25 19:26:42
【问题描述】:

我有以下数据框:

df=pd.DataFrame({'A': ['1','2', '3'], 'List': [['a1','a2'], ['b1','b2'], ['c1','c2']]})

Out[18]: 
   A      List
0  1  [a1, a2]
1  2  [b1, b2]
2  3  [c1, c2]

我想将列 List 分解为同一行的两个新列(L1L2)。

   A  L1  L2
0  1  a1  a2
1  2  b1  b2
2  3  c1  c2

哪种方式最快?

最好同时为列指定名称(L1 和 L2)。

在此先感谢您并致以最诚挚的问候,

巴勃罗·G

【问题讨论】:

    标签: python pandas list dataframe explode


    【解决方案1】:

    解决方案

    试试这个:pd.concat + df[col].apply(pd.Series)

    # Option-1
    pd.concat([df['A'], df['B'].apply(pd.Series).rename(columns={0: 'L1', 1: 'L2'})], axis=1)
    
    # Option-2
    # credit: Mark Wang; for suggestion on using, index = ['L1', 'L2']
    pd.concat([df['A'], df['B'].apply(pd.Series, index=['L1', 'L2'])], axis=1)
    

    如果您只想保留 L1L2

    # Option-1
    df['B'].apply(pd.Series).rename(columns={0: 'L1', 1: 'L2'})
    
    # Option-2
    # credit: Mark Wang; for suggestion on using, index = ['L1', 'L2']
    df['B'].apply(pd.Series, index=['L1', 'L2'])
    

    如果要保留所有原始列

    # with prefix
    pd.concat([df, df['B'].apply(pd.Series).add_prefix(f'B_')], axis=1)
    
    # with user given column-names
    pd.concat([df, df['B'].apply(pd.Series).rename(columns={0: 'L1', 1: 'L2'})], axis=1)
    

    逻辑

    • 沿列连接dfdf_expanded (axis=1)。
    • 其中,df_expanded 是通过执行df[col].apply(pd.Series) 获得的。 这会将列表扩展为列。
    • 我添加了一个.add_prefix('B_') 以明确列的来源(列B)。

    示例

    df = pd.DataFrame({'A': [1,2,3], 
                       'B': [['11', '12'], 
                             ['21', '22'], 
                             ['31', '32']]
                       })
    col = 'B'
    pd.concat([df, df[col].apply(pd.Series).add_prefix(f'{col}_')], axis=1)
    

    【讨论】:

    • 谢谢你,效果很好。是否有额外的参数来删除列“A”?
    • 如果您只想要列L1L2,则不要进行连接。只需 df['B'].apply(pd.Series).rename(columns={0: 'L1', 1: 'L2'}) 即可完成这项工作。
    • 感谢您的 cmets 进行进一步调查,我尝试了这个:df[['L1','L2']]=df['B'].apply(pd.Series) 并且它有效。
    • 是的,那是因为它将创建的列分配给 df 中的两个新列。你可以用很多不同的方式来做这些事情。由用户决定他/她将如何选择这样做。
    【解决方案2】:

    试试:

    df[['A']].join(df['List'].apply(pd.Series, index=['L1', 'L2']))
    

    【讨论】:

    • @CypherX 对于检查 pd.Series 需要什么总是有用的 :)
    猜你喜欢
    • 2021-11-14
    • 2018-02-03
    • 2014-07-04
    • 1970-01-01
    • 2021-03-20
    • 2018-07-16
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多