微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

应用函数和返回多列的最pythonic方法是什么?

在使用Pandas时,我经常会遇到一个现有函数,它接受多个参数并返回多个值:

def foo(val_a, val_b):
    """
    Some example function that takes in and returns multiple values.
    Can be a lot more complex.
    """
    sm = val_a + val_b
    sb = val_a - val_b
    mt = val_a * val_b
    dv = val_a / val_b
    return sm, sb, mt, dv

假设我有一个数据帧:

import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8]])
df
Out[6]: 
   0  1
0  1  2
1  3  4
2  5  6
3  7  8

我想要的是在df上将foo应用于第0列和第1列作为参数,并将结果放入df的新列中,而不修改foo,如下所示:

df_out
Out[7]:
   0  1  su  sb  mt  dv
0  1  2  3   -1  2   0.5
1  3  4  7   -1  12  0.75
2  5  6  11  -1  30  0.833
3  7  8  15  -1  56  0.875

实现这一目标的最pythonic方法是什么?

解决方法:

您可以使用apply DataFrame构造函数

cols = ['sm','sb','mt','dv']
df[cols] = pd.DataFrame(df.apply(lambda x: foo(x[0], x[1]), 1).values.tolist(),columns= cols)
print (df)
   0  1  sm  sb  mt        dv
0  1  2   3  -1   2  0.500000
1  3  4   7  -1  12  0.750000
2  5  6  11  -1  30  0.833333
3  7  8  15  -1  56  0.875000

解决方concat

cols = ['sm','sb','mt','dv']
df[cols] = pd.concat(foo(df[0], df[1]), axis=1, keys=cols)
print (df)
   0  1  sm  sb  mt        dv
0  1  2   3  -1   2  0.500000
1  3  4   7  -1  12  0.750000
2  5  6  11  -1  30  0.833333
3  7  8  15  -1  56  0.875000

也可以创建新的DataFrame然后concat原始:

cols = ['sm','sb','mt','dv']
df1 = pd.concat(foo(df[0], df[1]), axis=1, keys=cols)
print (df1)
   sm  sb  mt        dv
0   3  -1   2  0.500000
1   7  -1  12  0.750000
2  11  -1  30  0.833333
3  15  -1  56  0.875000

df = pd.concat([df, df1], axis=1)
print (df)
   0  1  sm  sb  mt        dv
0  1  2   3  -1   2  0.500000
1  3  4   7  -1  12  0.750000
2  5  6  11  -1  30  0.833333
3  7  8  15  -1  56  0.875000

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐