两列

时间:2018-06-12 13:54:15

标签: python pandas dataframe group-by average

我已经四处寻找并拥有自己的解决方案,但我相信有更好的方法来实现这一目标。

我有一个包含以下列的数据框:

from_country   to_country    score

from_country和to_country列具有相同的条目集,例如美国,英国,中国等。对于from-to的每个组合,都有一个特定的分数。

我需要计算每个国家/地区的平均分数,无论是出现在from_country还是to_country字段中。

df_from = df[["from_country", "score"]].copy()
df_from.rename(columns={"from_country":"country"}, inplace=True)
df_to = df[["to_country", "score"]].copy()
df_to.rename(columns={"to_country":"country"}, inplace=True)
df_countries = pd.concat([df_from, df_to])

然后最终计算出新数据帧的平均值。

有没有办法做得更好?

由于

2 个答案:

答案 0 :(得分:2)

您可以先stack列,然后只需一个简单的groupby即可获得所有平均值。

df.set_index('score').stack().reset_index().groupby(0).score.mean()

这是一个重命名列

的示例
import pandas as pd
df = pd.DataFrame({'from_country': ['A', 'B', 'C', 'D', 'E', 'G'],
                   'to_country': ['G', 'C', 'Z', 'X', 'A', 'A'],
                   'score': [1, 2, 3, 4, 5, 6]})

stacked = df.set_index('score').stack().to_frame('country').reset_index().drop(columns='level_1')
#    score country
#0       1       A
#1       1       G
#2       2       B
#3       2       C
#4       3       C
#5       3       Z
#...

stacked.groupby('country').score.mean()

输出:

country
A    4.0
B    2.0
C    2.5
D    4.0
E    5.0
G    3.5
X    4.0
Z    3.0
Name: score, dtype: float64

答案 1 :(得分:1)

def override_search end + set_index的另一种方式:

concat