Суммируйте столбцы двух панелей данных разных размеров только для определенных строк - PullRequest
0 голосов
/ 18 октября 2018

У меня есть два кадра данных панд, выглядящих так:

df1:
      n  column1
0   5.0      0.0
1   6.0      0.0
2   7.0      0.0
3   8.0      0.0
4   9.0      0.0
5  10.0      0.0

df2:
     n  column2
0  6.0      1.0
1  7.0      1.0
2  8.0      1.0

Я хочу суммировать column1 и column2 только для строк, где n одинаково.Желаемый результат выглядит следующим образом:

df3:
      n  column1
0   5.0      0.0
1   6.0      1.0
2   7.0      1.0
3   8.0      1.0
4   9.0      0.0
5  10.0      0.0

Обратите внимание, что:

  • Значения n могут различаться в зависимости от случая, поэтому я не могу заполнитьстолбцы df2 с нулями и выполняют классическую сумму.
  • Значения n не должны изменяться в конце.Поэтому я бы хотел избежать обходных путей, таких как смещение значений n , чтобы они соответствовали индексам строк.
  • То, что я пробовал до сих пор, дает что-то вроде:

          n  column1
    0   5.0      1.0
    1   6.0      1.0
    2   7.0      1.0
    3   8.0      NaN
    4   9.0      NaN
    5  10.0      NaN
    

    Поскольку сумма по умолчанию выполняется на основе общих индексов строки, а не на n , как я хочу.

Как я могу это сделатьсо встроенными функциями панд?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Я решил это, объединив фрейм данных и суммировав его на пандах:

df = pd.merge(df1, df2, how='outer', on='n')

df['sum'] = df['column1'] + df['column2']

df[['n', 'sum']].fillna(0)

результат выглядит так:

    n   sum
0   5.0 0.0
1   6.0 1.0
2   7.0 1.0 
3   8.0 1.0
4   9.0 0.0
5   10.0    0.0
0 голосов
/ 18 октября 2018

Используйте Series.add, но сначала создайте индексы из столбцов n по set_index:

df = (df2.set_index('n')['column2']
         .add(df1.set_index('n')['column1'], fill_value=0)
         .reset_index(name='column1'))
print (df)
      n  column1
0   5.0      0.0
1   6.0      1.0
2   7.0      1.0
3   8.0      1.0
4   9.0      0.0
5  10.0      0.0

Другое решение с merge и левое соединение:

df = (df1.merge(df2, on='n', how='left'))
df['column1'] = df['column2'].add(df['column1'], fill_value=0)
df = df.drop('column2', axis=1)
print (df)
      n  column1
0   5.0      0.0
1   6.0      1.0
2   7.0      1.0
3   8.0      1.0
4   9.0      0.0
5  10.0      0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...