【问题标题】:Apply a custom function on a pandas dataframe [closed]在熊猫数据框上应用自定义函数[关闭]
【发布时间】:2021-02-22 11:21:37
【问题描述】:

我有一个这样的熊猫数据框:

pd.DataFrame({
'gender': ['male', 'female', 'female', 'male', 'unknown'],
'height': [70, 61, 64, 73, 69]})

我正在尝试编写一个自定义函数,将汇总统计信息应用于男性/女性身高。然后,我想在 pandas 数据框上应用该自定义函数。 我不是在寻找 lambda 函数,必须是自定义函数。我的代码:

def get_summary(height):
    if df['gender'] == 'male':
        summary = np.mean(height)
    elif df['gender'] == 'female':
        summary = np.sqrt(height)
    else:
        summary = np.max(height)
    return summary

然后我想应用这个函数并将它分配给一个名为“summary”的新列。代码:

df['summary'] = df['height'].apply(get_summary)

我收到的错误信息:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

【问题讨论】:

  • 您的函数签名不正确,因为 df 超出了您传递的范围

标签: python-3.x pandas function


【解决方案1】:

比较height.name的第一个更改,值是分组列,这里gender并传递给GroupBy.transform以在Series中返回输出,长度与原始DataFrame相似,因此可以分配给新列:

def get_summary(x):
    print (x)
    print (x.name)

    if x.name == 'male':
        summary = np.mean(x)
    elif x.name == 'female':
        summary = np.sqrt(x)
    else:
        summary = np.max(x)
    return summary

df['summary'] = df.groupby('gender')['height'].transform(get_summary)
print (df)
    gender  height   summary
0     male      70  71.50000
1   female      61   7.81025
2   female      64   8.00000
3     male      73  71.50000
4  unknown      69  69.00000

【讨论】:

  • 我不明白“height.name”在这里做什么?第一次更改比较是什么意思?
  • @MichaelMathewsJr。 - 这是令人毛骨悚然的价值,所以如果使用df.groupby('gender'),那么.name首先是male,然后是female,最后是unknown
  • @MichaelMathewsJr。 - 而是重命名为x,因为与height 无关
  • 它必须是“名字”还是我可以在这里传递任何东西?
  • @MichaelMathewsJr。 - 如果使用def get_summary(x):,则为x.name,因为x被分组height列,如果更改def get_summary(group):则需要group.name
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 2023-04-03
  • 2018-04-21
相关资源
最近更新 更多