Среднее одно поле по двум столбцам - PullRequest
0 голосов
/ 12 июня 2018

Я искал и нашел свое собственное решение, но я считаю, что есть лучший способ добиться результата.

У меня есть кадр данных со следующими столбцами:

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 голосов
/ 12 июня 2018

Другой способ с set_index + concat:

pd.concat((
    df.set_index('from_country').score, 
    df.set_index('to_country').score
)).groupby(level=0).mean()

A    4.0
B    2.0
C    2.5
D    4.0
E    5.0
G    3.5
X    4.0
Z    3.0
0 голосов
/ 12 июня 2018

Вы можете сначала 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
...