gpt4 book ai didi

python - 使用多列键 reshape Pandas 数据框

转载 作者:行者123 更新时间:2023-12-01 02:55:29 26 4
gpt4 key购买 nike

我有一个 pandas 数据框,其中有两列作为唯一值(eng_id ,日期)。我需要将其转换为以下形状,并通过 Equipment_id 唯一值及其测量值创建列。我怎样才能做到这一点?

From:
eng_id date equipment_id measurement
1 2016-01 100 20
1 2016-01 200 46
1 2016-01 300 18
1 2016-04 200 33
1 2016-05 200 27
2 2016-01 300 9
2 2016-01 400 15
2 2016-05 400 65
2 2016-05 500 51
2 2016-05 600 16

To:

ID 100 200 300 400 500 600
1,2016-01 20 46 18 0 0 0
1,2016-04 0 33 0 0 0 0
1,2016-05 0 27 0 0 0 0
2,2016-01 0 0 9 15 0 0
2,2016-05 0 0 0 65 51 16

最佳答案

将两列连接到 ID 并使用 pivot :

df['ID'] = df['eng_id'].astype(str) + ',' + df['date']
df = df.pivot(index='ID', columns='equipment_id', values='measurement').fillna(0).astype(int)
print (df)
equipment_id 100 200 300 400 500 600
ID
1,2016-01 20 46 18 0 0 0
1,2016-04 0 33 0 0 0 0
1,2016-05 0 27 0 0 0 0
2,2016-01 0 0 9 15 0 0
2,2016-05 0 0 0 65 51 16

set_index 类似的解决方案+ unstack :

df['ID'] = df['eng_id'].astype(str) + ',' + df['date']
df = df.set_index(['ID', 'equipment_id'])['measurement'].unstack(fill_value=0)
print (df)
equipment_id 100 200 300 400 500 600
ID
1,2016-01 20 46 18 0 0 0
1,2016-04 0 33 0 0 0 0
1,2016-05 0 27 0 0 0 0
2,2016-01 0 0 9 15 0 0
2,2016-05 0 0 0 65 51 16

但如果 ID 中需要 2 列:

df = df.set_index(['eng_id', 'date', 'equipment_id'])['measurement'].unstack(fill_value=0)
print (df)
equipment_id 100 200 300 400 500 600
eng_id date
1 2016-01 20 46 18 0 0 0
2016-04 0 33 0 0 0 0
2016-05 0 27 0 0 0 0
2 2016-01 0 0 9 15 0 0
2016-05 0 0 0 65 51 16

对于列添加 reset_index + rename_axis :

df = df.set_index(['eng_id', 'date', 'equipment_id'])['measurement'].unstack(fill_value=0)
.reset_index()
.rename_axis(None, axis=1)
print (df)
eng_id date 100 200 300 400 500 600
0 1 2016-01 20 46 18 0 0 0
1 1 2016-04 0 33 0 0 0 0
2 1 2016-05 0 27 0 0 0 0
3 2 2016-01 0 0 9 15 0 0
4 2 2016-05 0 0 0 65 51 16

但是如果得到:

ValueError: Index contains duplicate entries, cannot reshape

这意味着您有重复项并且需要 pivot_table使用一些聚合函数,例如 meansum...:

print (df)
eng_id date equipment_id measurement
0 1 2016-01 100 20 <-duplicate 1 2016-01 100
1 1 2016-01 100 30 <-duplicate 1 2016-01 100
2 1 2016-01 200 46
3 1 2016-01 300 18
4 1 2016-04 200 33
5 1 2016-05 200 27
6 2 2016-01 300 9
7 2 2016-01 400 15
8 2 2016-05 400 65
9 2 2016-05 500 51
10 2 2016-05 600 16

df['ID'] = df['eng_id'].astype(str) + ',' + df['date']
df = df.pivot_table(index='ID',
columns='equipment_id',
values='measurement',
fill_value=0,
aggfunc='mean')
print (df)
equipment_id 100 200 300 400 500 600
ID
1,2016-01 25 46 18 0 0 0 <= (20+30)/2=25
1,2016-04 0 33 0 0 0 0
1,2016-05 0 27 0 0 0 0
2,2016-01 0 0 9 15 0 0
2,2016-05 0 0 0 65 51 16

或者使用groupby + 聚合函数 + unstack :

df['ID'] = df['eng_id'].astype(str) + ',' + df['date']
df = df.groupby(['ID', 'equipment_id'])['measurement'].mean().unstack(fill_value=0)
print (df)
equipment_id 100 200 300 400 500 600
ID
1,2016-01 25 46 18 0 0 0 <= (20+30)/2=25
1,2016-04 0 33 0 0 0 0
1,2016-05 0 27 0 0 0 0
2,2016-01 0 0 9 15 0 0
2,2016-05 0 0 0 65 51 16

关于python - 使用多列键 reshape Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44244155/

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