2017-08-17 17 views
1

データフレームはいくつかの値を列に格納し、それらの値を関数に渡して別のデータフレームを取得します。返されたデータフレームの列を元のデータフレームに連結したいと思います。pandasデータフレームとlambdaが別のデータフレームを返す場合の適用結果(lambda)

私は

i = pd.concat([i, i[['cid', 'id']].apply(lambda x: xy(*x), axis=1)], axis=1) 

ような何かをしようとしたが、それは誤りでは動作しませんでした:

ValueError: cannot copy sequence with size 2 to array axis with dimension 1 

だから私はこのように行った:

def xy(x, y): 
    return pd.DataFrame({'x': [x*2], 'y': [y*2]}) 

df1 = pd.DataFrame({'cid': [4, 4], 'id': [6, 10]}) 
print('df1:\n{}'.format(df1)) 


df2 = pd.DataFrame() 
for _, row in df1.iterrows(): 
    nr = xy(row['cid'], row['id']) 
    nr['cid'] = row['cid'] 
    nr['id'] = row['id'] 
    df2 = df2.append(nr, ignore_index=True) 

print('df2:\n{}'.format(df2)) 

が出力:

df1: 
    cid id 
0 4 6 
1 4 10 

df2: 
    x y cid id 
0 8 12 4 6 
1 8 20 4 10 

コードがうまく見えず、ゆっくりと動作するはずです。

正常に動作するようにパンダ/ピジョンの方法がありますか?

のpython 2.7

答えて

1

オプション0 pd.DataFrame.assignとほとんどの直接
。あまり一般化できない。

df1.assign(x=df1.cid * 2, y=df1.id * 2) 

    cid id x y 
0 4 6 8 12 
1 4 10 8 20 

新しい列
を追加するオプション1

使用pd.DataFrame.joinこれはlambda

df1.join(df1.apply(lambda x: pd.Series(x.values * 2, ['x', 'y']), 1)) 

    cid id x y 
0 4 6 8 12 
1 4 10 8 20 

オプション2
applyを使用した後の新しい列に隣接する方法を示しています新しい列 を追加する使用pd.DataFrame.assignこれはあなたの関数は実際には2

によって乗算された場合、3
しかし lambda

df1.assign(**df1.apply(lambda x: pd.Series(x.values * 2, ['x', 'y']), 1)) 

    cid id x y 
0 4 6 8 12 
1 4 10 8 20 

オプションでapplyを使用した後の新しい列に隣接する方法を示しています

df1.join(df1.mul(2).rename(columns=dict(cid='x', id='y'))) 

または

df1.assign(**df1.mul(2).rename(columns=dict(cid='x', id='y'))) 
+0

df1.assign(** df1.apply(lambda x:...)は必要に応じて機能します。ありがとうございました! – user3657041

関連する問題