Заполнение NaN и Пустое значение в другом столбце - PullRequest
0 голосов
/ 23 мая 2018

Я хочу заполнить NaN и Пустое значение другим значением столбца, в этом случае столбец barcode_y заполнен столбцом barcode_x

Вот мои данные

    id      barcode_x     barcode_y A   B
0   7068    38927887      38927895  0   12
1   7068    38927895      38927895  0   1
2   7068    39111141      38927895  0   4
3   7116    73094237                18  309
4   7154    37645215      37645215  0   9
5   7342    86972909           NaN  7   25

Вот что янужно

    id      barcode_x     barcode_y A   B
0   7068    38927887      38927895  0   12
1   7068    38927895      38927895  0   1
2   7068    39111141      38927895  0   4
3   7116    73094237      73094237  18  309
4   7154    37645215      37645215  0   9
5   7342    86972909      86972909  7   25

Как мне это сделать?

Ответы [ 5 ]

0 голосов
/ 23 мая 2018

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

x, y = df['barcode_x'], df['barcode_y']
y.mask(y.eq('') | y.isna(), x)

0    38927895
1    38927895
2    38927895
3    73094237
4    37645215
5    86972909
Name: barcode_y, dtype: object
0 голосов
/ 23 мая 2018

Попробуйте это,

def fillValues(x):    
   x = x['barcode_x'] if np.isnan(x['barcode_y']) else x['barcode_y']
   return x

df["barcode_y"] = df.apply(lambda x : fillValues(x),axis=1)
print(df)
0 голосов
/ 23 мая 2018

В этом случае я использовал бы comb_first ... особенно, если barcode_y не dtype object

df.barcode_y.combine_first(df.barcode_x)

Если barcode_y равно dtype object, я думаю, вы можете пойти на этот дополнительный шагкак ниже:

>>> df
   barcode_x barcode_y
0          1         0
1        123      None
2        543
>>> df.barcode_y = df.barcode_y.combine_first(df.barcode_x)
>>> df
   barcode_x barcode_y
0          1         0
1        123       123
2        543
>>> df.loc[df.barcode_y.str.strip()=='', 'barcode_y'] = df.loc[df.barcode_y.str.strip()=='', 'barcode_x']
>>> df
   barcode_x  barcode_y
0          1          0
1        123        123
2        543        543
0 голосов
/ 23 мая 2018

Вы можете конвертировать пустые значения с помощью NaN, а затем использовать .fillna().

df['barcode_y'].replace(r'\s+', np.nan, regex=True).replace('',np.nan).fillna(df['barcode_x']).astype(int)

Выход:

0    38927895
1    38927895
2    38927895
3    73094237
4    37645215
5    86972909
Name: barcode_y, dtype: int32
0 голосов
/ 23 мая 2018

Я рекомендую маскирование, чтобы выполнить то, что вы хотите:

df['barcode_y'][df['barcode_y'].isna()] = df['barcode_x'][df['barcode_y'].isna()]

Это будет работать универсально, независимо от того, отсортированы ли столбцы каким-либо образом, например, если barcode_y - до или после barcode_x.

...