Как объединить повторяющиеся строки в python pandas - PullRequest
1 голос
/ 12 апреля 2020

У меня есть фрейм данных, аналогичный приведенному ниже. По какой-то причине каждая команда указана дважды, по одному списку, соответствующему каждому столбцу.

import pandas as pd
import numpy as np
d = {'Team': ['1', '2', '3', '1', '2', '3'], 'Points for': [5, 10, 15, np.nan,np.nan,np.nan], 'Points against' : [np.nan,np.nan,np.nan, 3, 6, 9]}
df = pd.DataFrame(data=d)




Team    Points for  Points against
0   1        5            Nan
1   2       10            Nan
2   3       15            Nan
3   1       Nan            3
4   2       Nan            6
5   3       Nan            9

Как можно просто объединить строки повторяющихся названий команд, чтобы не было пропущенных значений? Вот что я хотел бы:

 Team   Points for  Points against
0   1        5             3
1   2       10             6
2   3       15             9

Я пытался выяснить это с помощью pandas, но, похоже, не могу понять. Спасибо!

Ответы [ 4 ]

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

Я внес изменения в ваш код, заменив строку 'Nan' на numpy 'nan.

Одним из решений является расплавление данных, выпадение пустые записи и pivot обратно в ширину из длинных:

df = (df
      .melt('Team')
      .dropna()
      .pivot('Team','variable','value')
      .reset_index()
      .rename_axis(None,axis='columns')
      .astype(int)
     )

df


  Team  Points against  Points for
0   1      3              5
1   2      6              10
2   3      9              15
0 голосов
/ 12 апреля 2020
pd.pivot_table(df, values = ['Points for','Points against'],index=['Team'], aggfunc=np.sum)[['Points for','Points against']]

Выход

      Points for  Points against
Team                            
1            5.0             3.0
2           10.0             6.0
3           15.0             9.0
0 голосов
/ 12 апреля 2020

Вам необходимо groupby уникальные идентификаторы. Если есть также идентификатор игры или дата или что-то в этом роде, возможно, вам также понадобится сгруппировать их.

df.groupby('Team').agg({'Points for': 'max', 'Points against': 'max'})
0 голосов
/ 12 апреля 2020

В одну сторону, используя groupby. :

df = df.replace("Nan", np.nan)
new_df = df.groupby("Team").first()
print(new_df)

Вывод:

      Points for  Points against
Team                            
1            5.0             3.0
2           10.0             6.0
3           15.0             9.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...