我已经四处寻找并拥有自己的解决方案,但我相信有更好的方法来实现这一目标。
我有一个包含以下列的数据框:
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])
然后最终计算出新数据帧的平均值。
有没有办法做得更好?
由于
答案 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