在另一个排序中再次使用pandas中的顶行by value_count

2024-09-28 21:47:15 发布

您现在位置:Python中文网/ 问答频道 /正文

city     price
Moscow  | 100 
Paris   | 200 
Moscow  | 150 
Lisboa  | 200 
Rome    | 100 
Rome    | 175 
Moscow  | 300 
Rome    | 450 
Paris   | 500 
Istanbul| 430
Milan   | 200
Istanbul| 550
Berlin  | 300
Lisboa  | 500
Rome    | 200

我有一个包含许多列的数据框架,但现在我在示例中只使用这两个列

我需要通过计数获得前五名城市,我通过

data['city'].value_counts().head(5)

我看到这样的情况:

Rome    | 4
Moscow  | 3
Paris   | 2
Lisboa  | 2
Istanbul| 2

然后,我需要按价格对同一个前5名城市进行排序,并得到它们的平均值/中位数

如果我使用

data.groupby('city')['price'].agg(
['mean', 'median', 'count']
).sort_values('mean', ascending=False).head(10)

我得到了另一个按“价格”列排序的城市列表,但上一代码部分中的前5个城市不会保存

         mean
Istanbul| 450    
Paris   | 350
Lisboa  | 350
Berlin  | 300
Moscow  | 250
   

我的问题是:是否可以按另一列(在我的例子中是“价格”列)对先前创建的数据帧头(5)部分进行排序

我试着把它保存在变量中,比如

s = data['city'].value_counts().head(5)

但它是一个系列,只有city和count值,没有原始数据框中的价格值,所以我很沮丧。有什么想法吗?谢谢


Tags: 数据citydata排序value价格meanprice
1条回答
网友
1楼 · 发布于 2024-09-28 21:47:15

IIUC try^{}+^{}

import pandas as pd

df = pd.DataFrame({
    'city': {0: 'Moscow', 1: 'Paris', 2: 'Moscow', 3: 'Lisboa', 4: 'Rome',
             5: 'Rome', 6: 'Moscow', 7: 'Rome', 8: 'Paris', 9: 'Istanbul',
             10: 'Milan', 11: 'Istanbul', 12: 'Berlin', 13: 'Lisboa',
             14: 'Rome'},
    'price': {0: 100, 1: 200, 2: 150, 3: 200, 4: 100, 5: 175, 6: 300, 7: 450,
              8: 500, 9: 130, 10: 200, 11: 150, 12: 300, 13: 500, 14: 200}
})

df = (
    df.groupby('city')
        .agg({'city': 'count', 'price': ['mean', 'median']})
        .droplevel(0, axis=1)
        .nlargest(5, 'count')
        .reset_index()
)

print(df)

df

       city  count        mean  median
0      Rome      4  231.250000   187.5
1    Moscow      3  183.333333   150.0
2  Istanbul      2  140.000000   140.0
3    Lisboa      2  350.000000   350.0
4     Paris      2  350.000000   350.0

或根据值的结果合并\u计数如下:

s = df['city'].value_counts().head(5).reset_index(name='count')

new_df = df.merge(s.rename(columns={'index': 'city'}), on='city')
print(new_df)

new_df

        city  price  count
0     Moscow    100      3
1     Moscow    150      3
2     Moscow    300      3
3      Paris    200      2
4      Paris    500      2
5     Lisboa    200      2
6     Lisboa    500      2
7       Rome    100      4
8       Rome    175      4
9       Rome    450      4
10      Rome    200      4
11  Istanbul    130      2
12  Istanbul    150      2

然后执行任何操作:

new_df = (
    new_df.groupby(['city', 'count'])['price'].mean()
        .reset_index()
        .sort_values('count', ascending=False)
        .reset_index(drop=True)
)

new_df

       city  count       price
0      Rome      4  231.250000
1    Moscow      3  183.333333
2  Istanbul      2  140.000000
3    Lisboa      2  350.000000
4     Paris      2  350.000000

相关问题 更多 >