【问题标题】:Convert a column containing a list of dictionaries to multiple columns in pandas dataframe将包含字典列表的列转换为熊猫数据框中的多列
【发布时间】:2017-07-26 09:16:46
【问题描述】:

我有一个 Pandas 数据框,例如:

pd.DataFrame({'a':[1,2], 'b':[[{'c':1,'d':5},{'c':3, 'd':7}],[{'c':10,'d':50}]]})
Out[2]: 
   a                                         b
0  1  [{u'c': 1, u'd': 5}, {u'c': 3, u'd': 7}]
1  2                    [{u'c': 10, u'd': 50}]

如果“b”中有多个元素,我想扩展“b”列并重复“a”列,如下所示:

Out[2]: 
   a   c   d
0  1   1   5
1  1   3   7
2  2  10  50

我尝试在每一行上使用apply函数但我没有成功,显然apply将一行转换为一行。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将concatlist comprehension 一起使用:

    df = pd.concat([pd.DataFrame(x) for x in df['b']], keys=df['a'])
           .reset_index(level=1, drop=True).reset_index()
    
    print (df)
       a   c   d
    0  1   1   5
    1  1   3   7
    2  2  10  50
    

    编辑:

    如果索引是唯一的,那么可以对所有列使用join

    df1 = pd.concat([pd.DataFrame(x) for x in df['b']], keys=df.index)
            .reset_index(level=1,drop=True)
    df = df.drop('b', axis=1).join(df1).reset_index(drop=True)
    print (df)
       a   c   d
    0  1   1   5
    1  1   3   7
    2  2  10  50
    

    我尝试简化解决方案:

    l = df['b'].str.len()
    df1 = pd.DataFrame(np.concatenate(df['b']).tolist(), index=np.repeat(df.index, l))
    df = df.drop('b', axis=1).join(df1).reset_index(drop=True)
    print (df)
       a   c   d
    0  1   1   5
    1  1   3   7
    2  2  10  50
    

    【讨论】:

    • 在我的真正问题中,'a' 不是单列。在那种情况下我可以使用这种方法吗?我有几列要重复。@jezrael
    猜你喜欢
    • 2016-09-06
    • 2017-12-12
    • 2018-11-25
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2017-10-02
    • 2021-09-07
    • 2019-10-12
    相关资源
    最近更新 更多