我在pandas data frame
中有一些数据,我之前将currency
和value
转换为来自USD
CYN
的{{1}} }
(Chinese Yuan)
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
我想根据港口所在的国家/地区对数据进行分组 目的是以有意义的方式可视化每个国家的价值清单。我很欣赏任何关于什么样的图表适合完成工作的建议。
答案 0 :(得分:1)
我认为您需要pivot
,然后按plot.bar
或plot
绘图:
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:索引包含重复的条目,无法重塑
然后需要pivot_table
一些汇总函数mean
,sum
...(默认函数是&#39;表示&#39;):
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()
groupby
和mean
的替代解决方案:
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
答案 1 :(得分:0)
您可以使用pandas boolean indexing和pandas.Series.str.startswith从数据框中筛选和选择值。例如,以下行为您提供以&#34; US&#34;开头的行。您可以随意存储。
df.loc[df['port'].str.startswith('US')]
这应该会为您提供COUNTRIES字典中每个国家/地区的数据框字典。
country_values = {}
for key in countries:
country_values[key] = df.loc[df['port'].str.startswith(key, na=False)]