如何按pandas中列的部分值进行分组?

时间:2017-03-08 05:05:49

标签: python pandas

我在pandas data frame中有一些数据,我之前将currencyvalue转换为来自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

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

2 个答案:

答案 0 :(得分: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:索引包含重复的条目,无法重塑

然后需要pivot_table一些汇总函数meansum ...(默认函数是&#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()

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

答案 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)]