Допустим, у меня есть 2 фрейма данных в пандах. Я хочу выполнить левое соединение этих фреймов данных очень конкретным способом, как показано ниже, и, вероятно, проще всего объяснить это на примере.

Первый кадр данных:

Дата Col1 Col2
1/1
2/1
...

Второй кадр данных:

Дата A B C
1/1 90 0 0
1/1 0 75 0
1/1 73 0 0
1/2 0 0 85
2/1 0 0 75

Даты в первом фрейме данных уникальны и будут использоваться для присоединения ко второму фрейму данных. Col1 и Col2 не пустые, но они не имеют отношения к тому, что я хочу сделать. Во втором фрейме данных дата может появляться несколько раз, и ровно один из столбцов A, B и C содержит число больше 0, а два других содержат 0. Также могут быть некоторые дополнительные столбцы, которые не имеют отношения к тому, что Я хочу делать.

Я хочу сохранить все в первом фрейме данных и добавить столбцы A, B и C таким образом, чтобы значения в этих столбцах были суммой всех значений данных во втором фрейме данных. Поэтому в приведенном выше примере я хотел бы, чтобы результат выглядел так:

Дата Col1 Col2 A B C
1/1 163 75 0
2/1 0 0 160
...

Я посмотрел на функцию соединения pandas, но, похоже, она не дает возможности суммировать столбцы так, как я хочу. Есть ли другой способ добиться такого результата? Я понимаю, что, возможно, мог бы написать для этого цикл for, но я надеялся, что есть более эффективный способ.

-1
James O'Donnell 19 Сен 2018 в 17:53

2 ответа

Лучший ответ

Произведите сумму groupby на df1 и merge результат с помощью df0:

In [127]: df1.groupby("Date", as_index=False).sum()
Out[127]: 
  Date    A   B    C
0  1/1  163  75    0
1  2/1    0   0  160

In [128]: df0.merge(df1.groupby("Date", as_index=False).sum())
Out[128]: 
  Date  Col1  Col2    A   B    C
0  1/1   NaN   NaN  163  75    0
1  2/1   NaN   NaN    0   0  160

(Здесь я предполагаю, что Date - это столбец, а не индекс, но вместо этого легко либо reset_index(), либо использовать level=0.)

1
DSM 19 Сен 2018 в 16:06
import pandas as pd

df1 = pd.DataFrame({'Col1': [1, 2], 'Col2': [3, 4]}, index=['1/1', '2/1'])
df2 = pd.DataFrame({'A': [90, 0, 73, 0, 0], 'B': [0, 75, 0, 0, 0], 'C': [0, 0, 0, 85, 75]}, index=['1/1', '1/1', '1/1', '2/1', '2/1'])

Фреймы данных df1 и df2 такие же, как в вашем сообщении. Чтобы «присоединиться» к фреймам данных так, как вы хотите, вы можете:

df = pd.concat([df1, df2.groupby(level=0).sum()], axis=1)

Здесь df:

     Col1  Col2  A   B    C
1/1  1     3     163 75   0
2/1  2     4     0   0    160

Обратите внимание, что это также работает, если индекс двух фреймов данных df1 и df2 не выровнен. С участием:

df3 = pd.DataFrame({'Col1': [1, 2, 3], 'Col2': [3, 4, 5]}, index=['1/1', '2/1', '4/1'])
df4 = pd.DataFrame({'A': [90, 0, 73, 0, 0, 20], 'B': [0, 75, 0, 0, 0, 0], 'C': [0, 0, 0, 85, 75, 0]}, index=['1/1', '1/1', '2/1', '3/1', '4/1', '4/1'])

И опять:

df = pd.concat([df1, df2.groupby(level=0).sum()], axis=1, sort=True)

Дан кем-то:

     Col1  Col2  A   B   C
1/1  1.0   3.0   90  75  0
2/1  2.0   4.0   73  0   0
3/1  NaN   NaN   0   0   85
4/1  3.0   5.0   20  0   75
1
Pouteri 19 Сен 2018 в 16:08