Python 如何按熊猫中列的部分值进行分组?

Python 如何按熊猫中列的部分值进行分组?,python,pandas,Python,Pandas,我在熊猫数据框中有一些数据,如下所示,我将之前的货币和值从CYN(人民币) 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

我在熊猫数据框中有一些数据,如下所示,我将之前的
货币
CYN
(人民币)

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
我想根据港口所在国和
目的是以有意义的方式将每个国家的价值清单形象化。我很感激任何关于什么样的图表适合所做工作的建议

您可以使用布尔索引和从数据帧中筛选和选择值。例如,下一行给出以“US”开头的行。你可以随意储存

df.loc[df['port'].str.startswith('US')]
这将为您的国家/地区提供每个国家/地区的数据帧字典

country_values = {}
for key in countries:
    country_values[key] = df.loc[df['port'].str.startswith(key, na=False)]
我认为您需要,然后根据或绘制:



但如果出现错误:

ValueError:索引包含重复的条目,无法重塑

然后需要一些聚合函数
均值
求和
。。。(默认函数为“平均值”):


非常感谢,我在这里得到了错误
ValueError:索引包含重复条目,无法重塑
,可能是我有重复的
供应商id
。怎么办?请检查答案,我试着解释什么是问题,什么是解决方案。非常感谢乔。我需要改进代码,并在午餐后提出新问题。在那之前要小心。
df.loc[df['port'].str.startswith('US')]
country_values = {}
for key in countries:
    country_values[key] = df.loc[df['port'].str.startswith(key, na=False)]
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()
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()
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