我有一个 Dataframe df,有两列,我想groupby一列,并加入属于同一组的列表,例如:
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]
我想保留所有副本。我有以下问题:
- Dataframe 的数据类型是对象。convert_objects()不能自动将column_b转换为list。我该如何做?
- 在df.groupby(...).中的函数应用什么(λ x:...)适用于?x?list的形式是什么?
- 我主要问题的解决方案
先谢谢你。
6条答案
按热度按时间ejk8hzay1#
object
dtype是一个包罗万象的dtype,基本上不表示int、float、bool、datetime或timedelta。因此它将它们存储为列表。convert_objects
尝试将列转换为这些dtype之一。你要
这将按
a
列中的值对数据框进行分组。了解有关groupby的更多信息。这是一个常规的列表
sum
(连接),就像[1, 2, 3] + [2, 5]
一样,结果是[1, 2, 3, 2, 5]
eufgjt7s2#
这是因为
sum
的运算符重载将列表连接在一起。结果df的索引将是column_a
中的值:z6psavjg3#
上面提出的使用
df.groupby('column_a').agg(sum)
的方法确实有效。但是,你必须确保你的列表只包含integers
,否则输出将不一样。如果要将所有列表项转换为整数,可以用途:
hpxqektj4#
accepted answer建议使用
groupby.sum
,它可以很好地处理少量列表,但是使用sum来连接列表是二次。对于大量列表,一个快得多的选项是使用
itertools.chain
或列表解析:itertools.chain
:列表理解:
输出:
速度比较
使用示例的n次重复来显示要合并的列表数量的影响:
agg(lambda x: np.concatenate(x.to_numpy()).tolist())
)。*wgx48brx5#
使用麻木而简单的“for”或“map”:
import numpy as np
df_sum_lists = pd.DataFrame(all_lists)
对于大型数据集,它比简单的“groupby-agg-sum”方法快350倍。
nbysray56#
谢谢,帮了我的忙