2017-03-08 116 views
2

我在pandas data frame一些数据如下其中I转换的currency和从CYN(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()打印以下的value较早到USD

<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 

第一2信的港口表示国家,我有一个地图,

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

我想根据港口所在国家的数据对数据进行分组,并且 的意图是以有意义的方式可视化每个国家的价值清单。我很感激任何关于什么样的图表适合完成这项工作的建议。

回答

1

我想你需要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 ...(默认功能是 '均值'):

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 
+0

非常感谢,在这里我得到的错误'ValueError:索引包含重复的条目,无法重塑'可能我有重复'supplier_id '。该怎么做? – Arefe

+0

请检查答案,我尝试解释什么是问题和解决方案。 – jezrael

+0

非常感谢乔。我需要改进代码,并在午餐后提出新的问题。照顾到那时。 – Arefe

0

您可以使用pandas布尔索引和pandas.Series.str.startswith筛选和选择数据框中的值。例如,下面一行提供了以“US”开头的行。不管你想要什么,你都可以存储它。

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)] 
相关问题