【问题标题】:Returning multiple columns with pandas apply and user-defined functions使用 pandas 应用和用户定义的函数返回多列
【发布时间】:2014-11-01 22:56:18
【问题描述】:

假设我有一个函数:

def fn(x)
    y = x ** 2
    z = x ** 3
    return y, z

我想使用df['x'].apply(lambda x: fn(x)) 在单独的列中返回yz。仍然使用fn(x) 有没有好方法?实际上,我的函数会复杂得多 - 所以我只想在应用程序中运行一次,然后将 output[0]output[1] 等分配给各个列。

【问题讨论】:

  • 我想你可以直接写df["y"], df["z"] = zip(*df["x"].apply(fn)),就像this question的回答一样。
  • 完美 - 我认为这确实有效。非常感谢!

标签: python pandas user-defined-functions multiple-columns apply


【解决方案1】:

这个方法怎么样? (注意,我根据下面的评论编辑了这个答案)因此应用步骤可以采用一个具有共享计算的函数并返回合并步骤所需的系列。

data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'], 'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}
frame = pd.DataFrame(data, columns = ['year','state','pop'])
def fn(x,head1,head2):
    y = x ** 2
    z = x ** 3
    return pd.Series({head1:y, head2:z}) 
frame = frame.merge(frame['pop'].apply(lambda s: fn(s,'xsqr','xcube')), left_index=True, right_index=True)

结果:

   year   state  pop   xcube   xsqr
0  2000    Ohio  1.5   3.375   2.25
1  2001    Ohio  1.7   4.913   2.89
2  2002    Ohio  3.6  46.656  12.96
3  2001  Nevada  2.4  13.824   5.76
4  2002  Nevada  2.9  24.389   8.41

【讨论】:

  • 谢谢 BKay - 问题是我需要使用 fn(x) 而不是单独的计算,例如s2 和 s3。 fn(x) 相当复杂,所以我无法分别对 y 和 z 进行计算。
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 2021-09-28
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
相关资源
最近更新 更多