将系列值插入到值为null的单独的pandas列中

时间:2019-07-08 00:51:43

标签: python pandas

我有两个df:

df1 = pd.DataFrame({'name':['foo','Bar','Foo','jim','john','mary','jim'],
                   'code1':[np.nan,np.nan,'432',np.nan,np.nan,np.nan,'563']})

df1

    name    code1
0   foo     NaN
1   Bar     NaN
2   Foo     432
3   jim     NaN
4   john    NaN
5   mary    NaN
6   jim     563


df2 = pd.DataFrame({'xyz':['this','column','doesnt','matter'],
                   'code2':['123','345','456','234']})

df2

    xyz      code2
0   this     123
1   column   345
2   doesnt  456
3   matter   234

df1的code1列中缺少值。我真的不需要任何匹配,我只想在此列中添加一些额外的代码。

所以我有df2,其中有一个code2列。我想采用这四个代码,并将它们添加到df1中的四个单元格中。

我的预期的输出是这样的:

df3

    name    code
0   foo     123 # new code
1   Bar     345 # new code
2   Foo     432 # code unchanged
3   jim     456 # new code 
4   john    234 # new code
5   mary    NaN # not important
6   jim     563 # code unchanged

到目前为止,我尝试了什么?

我已经保存了df2中的代码

codes = df2['code2']

codes

0    123
1    345
2    456
3    234
Name: code, dtype: object

然后我仅将df1过滤为具有空代码,因为我不想替换现有的代码,并且由于我只需要插入四个新代码,因此我获得了df1的前四行并将新代码分配给他们:

mask = df1['code1'].isnull()

df1['code1'][mask][:4] = codes

但是df1没有任何反应。仍然有nans。

我尝试了一些其他操作,获得了值,但也没有用:

df1['code1'][mask][:4].values = codes.values

然后,我在这里没什么主意。不起作用

df1['code1'][mask][list(range(4))] = codes.values

2 个答案:

答案 0 :(得分:3)

IIUC

s = df1.loc[df1.code1.isnull(),'code1']
# Filter the df1 first...
s.iloc[:len(df2)] = df2.code2.values
# Assign value to NaNs, regardless of index...
df1.loc[df1.code1.isnull(), 'code1'] = s

# Assign the result back 
df1
   name code1
0   foo   123
1   Bar   345
2   Foo   432
3   jim   456
4  john   234
5  mary   NaN
6   jim   563

答案 1 :(得分:2)

与其他答案相同,实现上略有不同。

import pandas as pd
import numpy as np

na_num = pd.isna(df1['code1']).sum()
replacer = df2['code2'].tolist() + max(na_num - len(df2), 0) * [np.nan]
df1.loc[pd.isna(df1['code1']), 'code1'] = replacer[:na_num]