【问题标题】:Create multiple new columns for pandas dataframe with apply + function使用 apply + 函数为 pandas 数据框创建多个新列
【发布时间】:2017-10-11 20:16:23
【问题描述】:

我有一个熊猫数据框df,其形状如下:(763, 65)

我使用以下代码创建了 4 个新列:

df[['col1', 'col2', 'col3','col4']] = df.apply(myFunc, axis=1)

def myFunc(row):
    #code to get some result from another dataframe
    return result1, result2, result3, result4

myFunc 返回的数据框的形状是(1, 4)。代码遇到如下错误:

ValueError: 传递值的形状是 (763, 4),索引意味着 (763, 65)

我知道df 有65 列,而myFunc 返回的数据只有4 列。但是,我只想创建 4 个新列(即 col1col2 等),因此我认为当它只返回 myFunc 中的 4 个列时代码是正确的。我做错了什么?

【问题讨论】:

标签: python pandas dataframe apply


【解决方案1】:

演示:

In [40]: df = pd.DataFrame({'a':[1,2,3]})

In [41]: df
Out[41]:
   a
0  1
1  2
2  3

In [42]: def myFunc(row):
    ...:     #code to get some result from another dataframe
    ...:     # NOTE: trick is to return pd.Series()
    ...:     return pd.Series([1,2,3,4]) * row['a']
    ...:

In [44]: df[['col1', 'col2', 'col3','col4']] = df.apply(myFunc, axis=1)

In [45]: df
Out[45]:
   a  col1  col2  col3  col4
0  1     1     2     3     4
1  2     2     4     6     8
2  3     3     6     9    12

免责声明:尽量避免使用 .apply(..., axis=1) - 因为它是 for loop 在引擎盖下 - 即它不是矢量化的,与矢量化 Pandas 相比,它的工作速度慢得多 /numpy ufuncs。

PS 如果您愿意在myFunc 函数中提供您尝试计算的详细信息,那么我们可以尝试找到一个矢量化解决方案...

【讨论】:

  • 我的问题(当然)出在隐藏代码中...myFunc 返回了一个带有列标题的数据框,这会以某种方式导致错误。我现在返回如下,它可以工作:return result[['col1', 'col2', 'col3', 'col4']].iloc[0]。当然,这意味着只取该系列的第一行,这是我在代码中想要的。至于矢量化,我稍后会创建一个新线程。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多