Pandas средняя группа - PullRequest
       28

Pandas средняя группа

1 голос
/ 27 апреля 2020

Я пытаюсь найти среднее значение по событию для каждого раунда (R1, R2, R3, R4). Не сыгранные раунды, к сожалению, представлены тремя различными способами (0, - или пустая ячейка).

    event   plyr    R1  R2  R3  R4
0   Houston Dave    67  90.0    70  72
1   Houston Bobx    69  69.0    69  69
2   Houston Carlx   69  71.0    71  71
3   Miamixx Cliff   67  70.0    70  70
4   Miamixx Dean    70  71.0    71  71
5   Miamixx Clive   69  69.0    -   0
6   Miamixx Patxx   71  70.0    -   0
7   Atlanta Phil    67  70.0    70  72
8   Atlanta Dave    69  NaN 71  73
9   Atlanta Bobx    69  NaN -   0

Я пытался заменить 0 и - на NaN, но все еще получаю разные результаты

df ['R3'] = df ['R3']. replace (['0', '-'], np.nan) df ['R4'] = df ['R4']. replace (['0' , '-'], np.nan)

Результаты

df.groupby('event')['R1','R2', 'R3', 'R4'].mean()


R1  R2  R4
event           
Atlanta 68.333333   70.000000   48.333333
Houston 68.333333   76.666667   70.666667
Miamixx 69.250000   70.000000   35.250000

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Среднее значение groupby исключает значения NaN, но включает нули. Поэтому вам нужно заменить на 0 или оставить NaN в зависимости от того, какой результат вы хотите получить.

При этом все значения - и NaN будут установлены на 0:

cols = ['R1', 'R2', 'R3', 'R4']

for col in cols:
    df[col] = np.where((df[col]=='-') | (df[col].isnull()==True), 0, df[col])
    df[col] = pd.to_numeric(df[col])

df.groupby('event').mean()

Если вы хотите NaN вместо 0, просто замените 0 in np.where() на np.NaN.

0 голосов
/ 27 апреля 2020

to_csv / read_csv

Считайте csv с соответствующими NaN значениями, указанными затем fillna с 0

from io import StringIO as io_
df = pd.read_csv(io_(df.to_csv(index=False)), na_values=['-']).fillna(0)

df.groupby('event')[['R1', 'R2', 'R3', 'R4']].mean()

                R1         R2     R3         R4
event                                          
Atlanta  68.333333  23.333333  47.00  48.333333
Houston  68.333333  76.666667  70.00  70.666667
Miamixx  69.250000  70.000000  35.25  35.250000

pd.to_numeric

df.filter(like='R').apply(pd.to_numeric, errors='coerce') \
  .fillna(0).groupby(df.event).mean()

                R1         R2     R3         R4
event                                          
Atlanta  68.333333  23.333333  47.00  48.333333
Houston  68.333333  76.666667  70.00  70.666667
Miamixx  69.250000  70.000000  35.25  35.250000
...