有一个列= [x,t,y,z]的数据,我想用外包数据填充[y,z]列。
以下代码适用于填充列y。
# data I want to fill
df=pd.DataFrame([['x1','t','NaN','Nan'],['x2','t','NaN','Nan'],
['x2','t','NaN','Nan'],['x3','t','NaN','Nan'],
['x3','t','NaN','Nan'],['x4','t','NaN','Nan'],
['x5','t','NaN','Nan']],
columns=list(['x','t','y','z']))
# source data
source=pd.DataFrame([['x1','y1','z1'],['x2','y2','z2'],['x3','y3','z3'],
['x4','y4','z4']],columns=list(['x','y','z']))
print('df before\n',df)
def applyFunc(x):
for i in range(0,len(source)):
if x==source.at[i,'x']:
return source.at[i,'y']
else:
return 1
df['y']=df['x'].apply(applyFunc)
print('\n\ndf after:\n',df)
它运行的结果如下:
df before
x t y z
0 x1 t NaN Nan
1 x2 t NaN Nan
2 x2 t NaN Nan
3 x3 t NaN Nan
4 x3 t NaN Nan
5 x4 t NaN Nan
6 x5 t NaN Nan
df after:
x t y z
0 x1 t y1 Nan
1 x2 t y2 Nan
2 x2 t y2 Nan
3 x3 t y3 Nan
4 x3 t y3 Nan
5 x4 t y4 Nan
6 x5 t 1 Nan
我想要的是一次填充[y,z]列。 结果我想得到这样的结果。
df after:
x t y z
0 x1 t y1 z1
1 x2 t y2 z2
2 x2 t y2 z2
3 x3 t y3 z3
4 x3 t y3 z3
5 x4 t y4 z4
6 x5 t 1 1
我试过了,但我还没有找到办法来获取它。我尝试了以下代码
def applyFunc(x):
for i in range(0,len(source)):
if x==source.at[i,'x']:
return (source.at[i,'y'],source.at[i,'z'])
else:
return (1,1)
df['y','z']=df['x'].apply(applyFunc)
虽然结果是这样的。
df after:
x t y z (y, z)
0 x1 t NaN Nan (y1, z1)
1 x2 t NaN Nan (y2, z2)
2 x2 t NaN Nan (y2, z2)
3 x3 t NaN Nan (y3, z3)
4 x3 t NaN Nan (y3, z3)
5 x4 t NaN Nan (y4, z4)
6 x5 t NaN Nan (1, 1)
答案 0 :(得分:1)
您可以像这样修改您的功能:
def applyFunc(x, col):
for i in range(0, len(source)):
if x == source.at[i, 'x']:
return source.at[i, col]
else:
return 1
然后简单地说:
df['y'] = df['x'].apply(applyFunc, col='y')
df['z'] = df['x'].apply(applyFunc, col='z')
当然,你可以循环使用' y'和' z'像这样:
for col in ['y', 'z']:
df[col] = df['x'].apply(applyFunc, col=col)
或者,如果你真的想要它在一行:
df['y'], df['z'] = df['x'].apply(applyFunc, col='y'), df['x'].apply(applyFunc, col='z')