将pandas数据帧与apply(lambda)的结果连接起来,其中lambda返回另一个数据帧

时间:2017-08-17 20:07:36

标签: python-2.7 pandas dataframe lambda concatenation

数据框在列中存储一些值,将这些值传递给函数我得到另一个数据帧。我想将返回的数据框的列连接到原始数据框。

我尝试做类似

的事情
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

代码看起来不太好,应该工作缓慢。

有没有pandas / pythonic方法可以正常工作并快速工作?

python 2.7

1 个答案:

答案 0 :(得分: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添加新列
这显示了在将applylambda

一起使用后如何连接新列
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
使用pd.DataFrame.assign添加新列 这显示了在将applylambda

一起使用后如何连接新列
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

选项3
但是,如果您的函数真的只是乘以2

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

或者

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