Python 2.7 将数据帧与应用(lambda)的结果连接起来,其中lambda返回另一个数据帧

Python 2.7 将数据帧与应用(lambda)的结果连接起来,其中lambda返回另一个数据帧,python-2.7,pandas,dataframe,lambda,concatenation,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,

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

我试着做一些类似的事情

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

选项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
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

选项2
使用
pd.DataFrame.assign
添加新列 这显示了在使用
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
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.apply(lambda x:…)根据需要工作。谢谢!