2017-11-17 19 views
0

列[= x、t、y、z]のデータがあり、列[y、z]をアウトソースデータ。pandas、列yのz値を設定します。xはアウトソースデータでの条件x:

次のコードは、列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) 

、実行結果は以下の通りである:私がしたいことは、一度列[Y、Z]を充填さ

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 

。 結果このようにしたいです。

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 

私が試してみましたが、私は結果はこのようなものですしながら、it.Iは、次のコード

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

あなたはこのようなあなたの機能を変更することができます。その後、

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) 

または、本当に必要なら1行:

df['y'], df['z'] = df['x'].apply(applyFunc, col='y'), df['x'].apply(applyFunc, col='z') 
+0

applyFuncには「else:」は必要ありません。 'for 1'と同じレベルでインデントされた' return 1'も簡単に動作し、よりきれいです。 – wkzhu