【问题标题】:pandas: aggregate a column of list into one listpandas:将一列列表聚合到一个列表中
【发布时间】:2020-02-21 18:44:50
【问题描述】:

我有以下数据框my_df

name         numbers
----------------------
A             [4,6]
B             [3,7,1,3]
C             [2,5]
D             [1,2,3]

我想将所有数字合并到一个新列表中,所以输出应该是:

 new_numbers
---------------
[4,6,3,7,1,3,2,5,1,2,3]

这是我的代码:

def combine_list(my_lists):
    new_list = []
    for x in my_lists:
        new_list.append(x)

    return new_list

new_df = my_df.agg({'numbers': combine_list})

new_df 看起来仍然和原来的一样:

              numbers
----------------------
0             [4,6]
1             [3,7,1,3]
2             [2,5]
3             [1,2,3]

我做错了什么?我如何让new_df 喜欢:

 new_numbers
---------------
[4,6,3,7,1,3,2,5,1,2,3]

谢谢!

【问题讨论】:

    标签: python-3.x pandas dataframe aggregate


    【解决方案1】:

    您需要flatten 值,然后通过构造函数创建新的Dataframe

    flatten = [item for sublist in df['numbers'].values.tolist() for item in sublist]
    

    或者:

    flatten = np.concatenate(df['numbers'].values).tolist()
    

    或者:

    from  itertools import chain
    
    flatten = list(chain.from_iterable(df['numbers'].values.tolist()))
    

    df1 = pd.DataFrame({'numbers':[flatten]})
    

    print (df1)
                                 numbers
    0  [4, 6, 3, 7, 1, 3, 2, 5, 1, 2, 3]
    

    时间here

    【讨论】:

    • functools.reduce(lambda x,y: x+y,l) 应该更快
    • @Wen - 我认为这取决于列表的大小、df 的长度,但by here 最快的解决方案是chain.from_iterable
    【解决方案2】:

    您可以使用 df['numbers'].sum() 返回一个组合列表来创建新的数据框

    new_df = pd.DataFrame({'new_numbers': [df['numbers'].sum()]})
    
        new_numbers
    0   [4, 6, 3, 7, 1, 3, 2, 5, 1, 2, 3]
    

    【讨论】:

    • 不幸的是你的解决方案是slow :(
    • @jezrael,哦,我没有测试时间
    • @jezrael,是的,我同意,它出奇的慢:(
    【解决方案3】:

    应该这样做:

    newdf = pd.DataFrame({'numbers':[[x for i in mydf['numbers'] for x in i]]})

    【讨论】:

      【解决方案4】:

      查看pandas groupby and join lists

      你正在寻找的是,

      my_df = my_df.groupby(['name']).agg(sum)

      【讨论】:

      • 请不要仅发布对其他 stackoverflow 问题的链接的答案。相反,投票/标记以关闭为重复,或者,如果问题不是重复的,定制此特定问题的答案。
      猜你喜欢
      • 2020-08-29
      • 2019-07-06
      • 2020-03-06
      • 2021-04-17
      • 2022-06-13
      • 2017-06-20
      • 1970-01-01
      • 2015-09-02
      • 2017-10-26
      相关资源
      最近更新 更多