pandas,在列x的条件下使用外包数据设置列y,z的值

时间:2017-11-17 14:07:56

标签: python pandas

有一个列= [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)

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')