gpt4 book ai didi

python - 如何按 Pandas 列的部分值进行分组?

转载 作者:行者123 更新时间:2023-11-28 18:24:10 24 4
gpt4 key购买 nike

我在 pandas 数据框 中有一些数据,如下所示,我之前将 currencyvalue 转换为 USD 来自 CYN (中国元)

      currency   port  supplier_id     value
0 USD CNAQG 35 118.8344
1 USD CNAQG 19 121.0082
2 USD CNAQG 49 86.9520
3 USD CNAQG 54 112.3130
4 USD CNAQG 113 113.7622
5 USD CNAQG 5 114.4868
6 USD CNAQG 55 111.5884
7 USD CNAQG 81 117.3852
8 USD CNAQG 2 111.5884
6651 USD USTPA 14 420.0000
6652 USD USTPA 56 420.0000
6653 USD USTPA 113 420.0000
6654 USD USTPA 5 500.0000
6655 USD USTPA 55 500.0000
6656 USD USTPA 193 390.0000
6657 USD USTPA 74 450.0000
6658 USD USTPA 35 420.0000
6659 USD USTPA 54 420.0000
6660 USD USTPA 231 450.0000

df.info() 打印以下内容,

<class 'pandas.core.frame.DataFrame'>
Int64Index: 6652 entries, 0 to 6660
Data columns (total 4 columns):
currency 6652 non-null object
port 6652 non-null object
supplier_id 6652 non-null int64
value 6652 non-null float64
dtypes: float64(1), int64(1), object(2)
memory usage: 259.8+ KB
None

港口的前两个字母表示国家,我有一张 map ,

COUNTRIES = {
"CN": "CHINA",
"US": "USA"
}

我想根据港口所在的国家/地区对数据进行分组,并且目的是以有意义的方式可视化每个国家的值(value)观 list 。我很感激任何关于什么样的图表适合完成的工作的建议。

最佳答案

我想你需要pivot然后绘制 plot.barplot :

df1 = pd.pivot(index=df['supplier_id'], 
columns = df['port'].str[:2].map(COUNTRIES),
values=df['value']).fillna(0)
print (df1)
port CHINA USA
supplier_id
2 111.5884 0.0
5 114.4868 500.0
14 0.0000 420.0
19 121.0082 0.0
35 118.8344 420.0
49 86.9520 0.0
54 112.3130 420.0
55 111.5884 500.0
56 0.0000 420.0
74 0.0000 450.0
81 117.3852 0.0
113 113.7622 420.0
193 0.0000 390.0
231 0.0000 450.0

df1.plot.bar()

df1.plot()

但如果错误:

ValueError: Index contains duplicate entries, cannot reshape

然后需要pivot_table使用一些聚合函数 meansum...(默认函数是 'mean'):

print (df)
currency port supplier_id value
0 USD CNAQG 35 118.8344
1 USD CNAQG 19 121.0082
2 USD CNAQG 49 86.9520
3 USD CNAQG 54 112.3130
4 USD CNAQG 113 113.7622
5 USD CNAQG 5 114.4868
6 USD CNAQG 55 111.5884
7 USD CNAQG 81 117.3852
8 USD CNAQG 2 111.5884
6651 USD USTPA 14 420.0000
6652 USD USTPA 56 420.0000
6653 USD USTPA 113 420.0000
6654 USD USTPA 5 500.0000
6655 USD USTPA 55 500.0000
6656 USD USTPA 193 390.0000
6657 USD USTPA 74 450.0000
6658 USD USTPA 35 420.0000
6659 USD USTPA 54 420.0000
6660 USD USTPA 231 450.0000 <-duplicates for USTPA, 231
6660 USD USTPA 231 800.0000 <-duplicates for USTPA, 231
COUNTRIES = {
"CN": "CHINA",
"US": "USA"
}

df1 = pd.pivot_table(df,
index='supplier_id',
columns = df['port'].str[:2].map(COUNTRIES),
values='value',
aggfunc=np.mean,
fill_value=0)
print (df1)
port CHINA USA
supplier_id
2 111.5884 0
5 114.4868 500
14 0.0000 420
19 121.0082 0
35 118.8344 420
49 86.9520 0
54 112.3130 420
55 111.5884 500
56 0.0000 420
74 0.0000 450
81 117.3852 0
113 113.7622 420
193 0.0000 390
231 0.0000 625 <-mean (450 + 800) /2

df1.plot.bar()

使用 groupbymean 的替代解决方案:

df1 = df.groupby(['supplier_id', df['port'].str[:2].map(COUNTRIES)])['value']
.mean()
.unstack(fill_value=0)
print (df1)
port CHINA USA
supplier_id
2 111.5884 0.0
5 114.4868 500.0
14 0.0000 420.0
19 121.0082 0.0
35 118.8344 420.0
49 86.9520 0.0
54 112.3130 420.0
55 111.5884 500.0
56 0.0000 420.0
74 0.0000 450.0
81 117.3852 0.0
113 113.7622 420.0
193 0.0000 390.0
231 0.0000 625.0

关于python - 如何按 Pandas 列的部分值进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42663400/

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