我有一个数据帧df,有两列,我想组合一列并加入列表属于同一组,例如:
column_a, column_b
1, [1,2,3]
1, [2,5]
2, [5,6]
过程完成后:
column_a, column_b
1, [1,2,3,2,5]
2, [5,6]
我想保留所有重复项。我有以下问题:
提前致谢。
答案 0 :(得分:28)
object
dtype是一个全能型dtype,基本上不是指int,float,bool,datetime或timedelta。所以它将它们存储为列表。 convert_objects
尝试将列转换为其中一个dtypes。
你想要
In [63]: df
Out[63]:
a b c
0 1 [1, 2, 3] foo
1 1 [2, 5] bar
2 2 [5, 6] baz
In [64]: df.groupby('a').agg({'b': 'sum', 'c': lambda x: ' '.join(x)})
Out[64]:
c b
a
1 foo bar [1, 2, 3, 2, 5]
2 baz [5, 6]
这会按照a
列中的值对数据框进行分组。阅读更多关于[groupby]。(http://pandas.pydata.org/pandas-docs/stable/groupby.html)。
这是一个常规列表sum
(连接),就像[1, 2, 3] + [2, 5]
答案 1 :(得分:10)
df.groupby('column_a').agg(sum)
这是因为运算符重载sum
将列表连接在一起。得到的df的索引将是column_a
:
答案 2 :(得分:0)
使用numpy和简单的“用于”或“地图”:
import numpy as np
u_clm = np.unique(df.column_a.values)
all_lists = []
for clm in u_clm:
df_process = df.query('column_a == @clm')
list_ = np.concatenate(df.column_b.values)
all_lists.append((clm, list_.tolist()))
df_sum_lists = pd.DataFrame(all_lists)
对于大型数据集,它比简单的“ groupby-agg-sum”方法快350倍。
答案 3 :(得分:0)
上面提出的使用 df.groupby('column_a').agg(sum)
的方法确实有效。但是,您必须确保您的列表只包含 integers
,否则输出将不相同。
如果要将所有列表项转换为整数,可以使用:
df['column_a'] = df['column_a'].apply(lambda x: list(map(int, x)))