我有两个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
答案 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]