Как сравнить два кадра данных и добавить строки и столбцы, которых нет в одном из двух - PullRequest
4 голосов
/ 03 апреля 2019

У меня есть маленький фрейм данных с меньшим количеством строк и столбцов, чем у фрейма большего размера. Как я могу добавить строки и столбцы, которые находятся в большем массиве данных, и заполнить их нулями? В основном я хочу добавить ячейки красного цвета на картинке ниже:

enter image description here

Пример игрушки ниже. Я пытался с pandas.concat, но в итоге я получаю все значения из большего кадра данных.

import numpy as np
import pandas as pd
df_big = pd.DataFrame(index=["a","b","c","d"])
df_big["x"] = np.arange(4)
df_big["y"] = df_big.x * 2
df_big["z"] = df_big.x * 3

df_small=pd.DataFrame(index=["a","b"])
df_small["x"]=[8,10]
df_small["y"]=[30,40]

out = pd.concat( [df_big, df_small] , axis=0)

Ответы [ 3 ]

3 голосов
/ 03 апреля 2019

Это похоже на хороший вариант использования для DataFrame.align:

_, out = df_big.align(df_small, fill_value=0)
out

    x   y  z
a   8  30  0
b  10  40  0
c   0   0  0
d   0   0  0

Вы также можете использовать DataFrame.reindex_like на df_small:

df_small.reindex_like(df_big).fillna(0, downcast='infer')

    x   y  z
a   8  30  0
b  10  40  0
c   0   0  0
d   0   0  0
2 голосов
/ 03 апреля 2019

Использование mul с notnull

df_small.mul(df_big.notnull(),fill_value=0).astype(int)
Out[275]: 
    x   y  z
a   8  30  0
b  10  40  0
c   0   0  0
d   0   0  0
#df_small.mul(df_big.astype(bool),fill_value=0).astype(int) # change to astype will achieve the same 
0 голосов
/ 03 апреля 2019

Поздний ответ, но вы также можете использовать pandas.DataFrame.update, то есть:

df_big[:] = 0
df_big.update(df_small, join='left', overwrite=True)

      x     y  z
a   8.0  30.0  0
b  10.0  40.0  0
c   0.0   0.0  0
d   0.0   0.0  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...