Панды - объединить несколько столбцов и сумма - PullRequest
0 голосов
/ 03 июля 2018

У меня есть основной df, вот так:

index   A  B  C
5       1  5  8
6       2  4  1
7       8  3  4
8       3  9  5

и вспомогательное df2, которое я хочу добавить к основному df, вот так:

index   A  B  
5       4  2 
6       4  3 
7       7  1 
8       6  2 

Столбцы A и B имеют одно и то же имя, однако основной df содержит много столбцов, которых вторичный df2 не имеет. Я хочу суммировать общие столбцы и оставить остальные как есть.

Выход:

index   A  B  C
5       5  7  8
6       6  7  1
7       15 4  4
8       9  11 5

Пробовал варианты df.join, pd.merge и groupby, но в данный момент не повезло.

Последняя попытка:

df.groupby('index').sum().add(df2.groupby('index').sum())

Но это не сохраняет общие столбцы.

pd.merge Я получаю суффикс _x и _y

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Не самый чистый способ, но это может сработать.

df_new = pd.DataFrame()
df_new['A'] = df['A'] + df2['A']
df_new['B'] = df['B'] + df2['B']
df_new['C'] = df['C']


print(df_new)

    A   B  C
0   5   7  8
1   6   7  1
2  15   4  4
3   9  11  5
0 голосов
/ 03 июля 2018

Использовать add только с теми же столбцами по intersection:

c = df.columns.intersection(df2.columns)
df[c] = df[c].add(df2[c], fill_value=0)
print (df)
        A   B  C
index           
5       5   7  8
6       6   7  1
7      15   4  4
8       9  11  5

Если используется только add, целые столбцы, которые не совпадают, преобразуются в float s:

df = df.add(df2, fill_value=0)
print (df)
        A   B    C
index             
5       5   7  8.0
6       6   7  1.0
7      15   4  4.0
8       9  11  5.0

EDIT:

Если возможно, строки общих столбцов:

print (df)
       A  B  C  D
index            
5      1  5  8  a
6      2  4  1  e
7      8  3  4  r
8      3  9  5  w
print (df2)
       A  B  C  D
index            
5      1  5  8  a
6      2  4  1  e
7      8  3  4  r
8      3  9  5  w

Решение аналогично, фильтруются только первые числовые столбцы по select_dtypes:

c = df.select_dtypes(np.number).columns.intersection(df2.select_dtypes(np.number).columns)
df[c] = df[c].add(df2[c], fill_value=0)
print (df)
        A   B  C  D
index              
5       5   7  8  a
6       6   7  1  e
7      15   4  4  r
8       9  11  5  w
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...