gpt4 book ai didi

python - Pandas 拆分列并汇总结果,索引中有重复项

转载 作者:太空宇宙 更新时间:2023-11-03 13:57:01 25 4
gpt4 key购买 nike

我有以下数据框:

ID     Type      Value
1 A 311
1 A 223
1 B 1233
2 A 424
2 A 553
3 A 11
3 B 4
3 B 5

我正在尝试通过拆分“类型”列来聚合“ID”列,这样每个 ID 都有自己的行和 A 类和 B 类的相应列。在“A”和“B”列中我想要跨行分配每个相应值的第一次出现。如果缺少 A 或 B(或两者),我想分配 NaN。为了清楚地说明这个想法,以下示例描述了我正在寻找的结果:

   ID       A           B
1 311 1233
2 424 NaN
3 11 4

结果保留 A 出现的第一个值(同时忽略 A 223 的第二个值)。由于 ID 1 中的 B 没有第二个值,它只保留值 1233。对于其他 ID,此逻辑将继续。

我一直在尝试使用 .pivot 来解决这个问题

df.pivot(columns="Type",values="Value")

这有助于我分隔类型列,这样我得到:

Type      A        B
0 311 NaN
1 223 NaN
2 NaN 1233
3 11 4

但是我无法将 ID 列作为索引传递,因为它给我错误:

ValueError: Index contains duplicate entries, cannot reshape

但是,在 ID 列上使用 drop_duplicates 会导致数据丢失。有什么方便的方法可以在 pandas 中进行这样的操作吗?

最佳答案

您需要先删除重复项,然后再旋转。

df.drop_duplicates(['ID', 'Type']).pivot('ID', 'Type', 'Value')

Type A B
ID
1 311.0 1233.0
2 424.0 NaN
3 11.0 4.0

或者,将 pivot_tableaggfunc='first' 一起使用:

df.pivot_table(index='ID', columns='Type', values='Value', aggfunc='first')

Type A B
ID
1 311.0 1233.0
2 424.0 NaN
3 11.0 4.0

性能
这实际上取决于您的数据和组数。最好是根据您自己的数据对其进行测试。

df_ = df.copy()
df = pd.concat([df_] * 10000, ignore_index=True)

%timeit df.pivot_table(index='ID', columns='Type', values='Value', aggfunc='first')
%timeit df.drop_duplicates(['ID', 'Type']).pivot('ID', 'Type', 'Value')
%timeit df.groupby(['ID', 'Type']).Value.first().unstack(1)

15.2 ms ± 272 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
8.63 ms ± 98 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
8.34 ms ± 246 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python - Pandas 拆分列并汇总结果,索引中有重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54280953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com