Присоединение Dataframes в пандах и столбцах суммы - PullRequest
0 голосов
/ 19 сентября 2018

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

Первый фрейм данных:

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

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

Дата ABC
1/1 90 0 0
1/1 0 750
1/1 73 0 0
2/1 0 0 85
2/1 0 0 75

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

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

Дата Col1 Col2 ABC
1/1 163 75 0
2/1 0 0 160
...

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

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018
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
0 голосов
/ 19 сентября 2018

Сделайте 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.)

...