我有可以按预期工作的示例代码段:
import pandas as pd
df = pd.DataFrame(data={'label': ['a', 'b', 'b', 'c'], 'wave': [1, 2, 3, 4], 'y': [0,0,0,0]})
df['new'] = df.groupby(['label'])[['wave']].transform(tuple)
结果是:
label wave y new
0 a 1 0 (1,)
1 b 2 0 (2, 3)
2 b 3 0 (2, 3)
3 c 4 0 (4,)
如果不是我在转换中使用
tuple
而不是set, frozenset, dict
,它会以类似的方式工作,但是如果我给出list
,则会得到完全意外的结果:df['new'] = df.groupby(['label'])[['wave']].transform(list)
label wave y new
0 a 1 0 1
1 b 2 0 2
2 b 3 0 3
3 c 4 0 4
有一种变通方法以获得预期的结果:
df['new'] = df.groupby(['label'])[['wave']].transform(tuple)['wave'].apply(list)
label wave y new
0 a 1 0 [1]
1 b 2 0 [2, 3]
2 b 3 0 [2, 3]
3 c 4 0 [4]
我考虑了可变性/不变性(列表/元组),但是对于集合/冻结集,它是一致的。
问题是为什么它会以这种方式工作?
最佳答案
我以前也遇到过类似的问题。我认为潜在的问题是,当列表中的元素数量与组中的记录数量匹配时,它将尝试对列表进行拆包,以便列表中的每个元素都映射到组中的一条记录。
例如,这将导致列表解包,因为列表的len与每个组的长度匹配:
df.groupby(['label'])[['wave']].transform(lambda x: list(x))
wave
0 1
1 2
2 3
3 4
但是,如果列表的长度与每个组的长度不同,则将获得所需的行为:
df.groupby(['label'])[['wave']].transform(lambda x: list(x)+[0])
wave
0 [1, 0]
1 [2, 3, 0]
2 [2, 3, 0]
3 [4, 0]
我认为这是列表拆包功能的副作用。
关于python - Pandas 转换列表不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57743798/