【问题标题】:Concatenate pandas dataframe with result of apply(lambda) where lambda returns another dataframe将 pandas 数据帧与 apply(lambda) 的结果连接起来,其中 lambda 返回另一个数据帧
【发布时间】:2018-01-26 09:37:20
【问题描述】:

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

我试图做类似的事情

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

【问题讨论】:

    标签: python-2.7 pandas dataframe lambda concatenation


    【解决方案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')))
    

    【讨论】:

    • df1.assign(**df1.apply(lambda x: ...) 根据需要工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2015-09-13
    • 2018-03-30
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多