python - Pandas 转换列表不一致的行为

标签 python pandas transform pandas-groupby

我有可以按预期工作的示例代码段:

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/

相关文章:

python 立即发送 TCP/IP 数据

python - 当我运行我的代码时,我的 pygame 代码卡住了

python - Pandas 对列进行排序并查找差异

python - pandas 中是否有一个函数可以在数据帧行中查找某些数据的 "gaps"?

C++11 将 shared_ptr 转换为 vector 和类

coding-style - 有什么理由不总是使用关键字参数?

python - Pandas 检索一列中的值对应于另一列中的最大值

python - 如何使用 Pandas 散点图系列

ios - 如何围绕其中心旋转 SwiftUI Path?

css transform-property 单独翻译