Панды суммируют два кадра данных на основе значения столбца - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть два кадра данных , которые я хочу суммировать по оси y, условно.

Например:

df_1

a    b    value
1    1    1011
1    2    1012
2    1    1021
2    2    1022

df_2

a    b    value
9    9    99
1    2    12
2    1    21

Я хочу сделать df_1['value'] -= df_2['value'] if df_1[a] == df_2[a] & df_1[b] == df_2[b], поэтому на выходе будет:

ВЫХОД

a    b    value
1    1    1011
1    2    1000
2    1    1000
2    2    1022

Есть ли способ достичь этого вместо итерации всего кадра данных ?(Это довольно большой)

Ответы [ 3 ]

5 голосов
/ 19 сентября 2019

Используйте выравнивание индекса, которое pandas обеспечивает здесь, установив a и b в качестве индекса перед вычитанием.


for df in [df1, df2]:
    df.set_index(['a', 'b'], inplace=True)

df1.sub(df2, fill_value=0).reindex(df1.index)

      value
a b
1 1  1011.0
  2  1000.0
2 1  1000.0
  2  1022.0
2 голосов
/ 19 сентября 2019

Вы также можете выполнить левое соединение и вычесть совпадающие значения.Вот как это сделать:

(pd.merge(df_1, df_2, how='left', on=['a', 'b'], suffixes=('_1', '_2'))
 .fillna(0)
 .assign(value=lambda x: x.value_1 - x.value_2)
)[['a', 'b', 'value']]
2 голосов
/ 19 сентября 2019

Вы можете позволить

merged = pd.merge(df_1, df_2, on=['a', 'b'], left_index=True)
df_1.value[merged.index] = merged.value_x - merged.value_y

Результат:

In [37]: df_1
Out[37]:
   a  b  value
0  1  1   1011
1  1  2   1000
2  2  1   1000
3  2  2   1022
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...