Как заменить несколько строк данных на среднее значение этих строк для каждого изменения в других столбцах? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть фрейм данных со столбцом «Медали», содержащий золото, серебро или бронзу. Есть столбец высоты и столбец года. Это выглядит примерно так -

Medal   Year    Height      0
Bronze  1896    -2.352063   1
Bronze  1896    -0.435173   1
Bronze  1896    0.220606    1
Bronze  1896    0.304680    1
Bronze  1896    0.607347    1
Bronze  1900    -1.847618   1
Bronze  1900    -1.410432   1
Bronze  1900    -0.334284   1
Bronze  1900    -0.182950   1
Bronze  1900    -0.031617   3
Bronze  1900    0.136532    2
Silver  2016    1.078162    9
Silver  2016    1.179051    2
Silver  2016    1.279940    1
Silver  2016    1.380829    4
Silver  2016    1.481718    3
Silver  2016    1.582607    3
Silver  2016    1.683495    8
Silver  2016    1.784384    4
Silver  2016    1.885273    3
Silver  2016    2.087051    1
Silver  2016    2.187940    1
Silver  2016    2.288829    1
Silver  2016    2.591496    1
Silver  2016    2.692385    1
Silver  2016    2.995052    1

То, что я хочу, просто -

Medal   Year    Height      
Bronze  1896    [Mean of heights having Bronze and 1896] 
Bronze  1896    [Mean of heights having Bronze and 1900]   
Bronze  1896    [Mean of heights having Silver and 2016]

Также столбец [0] представляет частоту. Поэтому мы должны умножить его на высоту, прежде чем вычислять среднее значение.

Я пытался использовать np.einsum, но я не смог заставить его работать для моего случая. Есть несколько похожих вопросов, но ни один из ответов не отвечает моим требованиям. Любые советы будут полезны.

PS: я нормализовал столбец высот и, следовательно, отрицательные значения

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

pandas.Index.repeat

  • Используйте столбец '0', чтобы повторить index
  • Используйте loc для переиндексации
  • Тогда groupby

df.loc[df.index.repeat(df['0'])].groupby(['Medal', 'Year'])['Height'].mean()

Medal   Year
Bronze  1896   -0.330921
        1900   -0.399675
Silver  2016    1.608415
Name: Height, dtype: float64
0 голосов
/ 12 ноября 2018

Один из способов - создать 2 серии с помощью панд groupby и разделить одну на другую:

group_cols = ['Medal', 'Year']
observations = df.groupby(group_cols)[0].sum()
total_height = df.assign(total=df['Height']*df[0]).groupby(group_cols)['total'].sum()

res = total_height / observations

print(res.reset_index())

    Medal  Year         0
0  Bronze  1896 -0.330921
1  Bronze  1900 -0.399675
2  Silver  2016  1.608415

Более кратко (спасибо @piRSquared):

df = df.rename(columns={0: 'Count'})

res = df.assign(Total=df['Height']*df['Count'])\
        .groupby(['Medal', 'Year']).sum()\
        .eval('Total / Count')\
        .rename('Mean').reset_index()

print(res)

    Medal  Year      Mean
0  Bronze  1896 -0.330921
1  Bronze  1900 -0.399675
2  Silver  2016  1.608415
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...