【问题标题】:Why does pandas treat these two strings differently in `apply`?为什么 pandas 在 `apply` 中对这两个字符串的处理方式不同?
【发布时间】:2021-11-01 14:15:24
【问题描述】:

我想知道为什么 pandas 以不同的方式对待两个 lambdas l3l4 - 两者都接受一个参数,都返回一个字符串,并且两者都不应该被执行,因为 df 实际上是空的:

import pandas as pd

df = pd.DataFrame(data={"col1": [], "col2": []})

l3 = lambda r: ""
l4 = lambda r: f"{r.col1}"

df["col3"] = df.apply(l3, axis=1)
df["col4"] = df.apply(l4, axis=1)  # Error: Wrong number of items passed 3, placement implies 1

print(type(df.apply(l3, axis=1)))  # this is a Series
print(type(df.apply(l4, axis=1)))  # this is a DataFrame

然而,df.apply 的返回类型不同。

额外问题:有没有更好的方法

df["col4"] = df.apply(l4, axis=1)

适用于空数据框?

更新:我相信熊猫代码的相关部分是这样的:

https://github.com/pandas-dev/pandas/blob/8e07787bc1030e5d13d3ad5e83b5d060a519ef67/pandas/core/apply.py#L718-L753

根据@mozway 的回答,该函数应用于一个空系列,并根据它是否有效,返回生成的新系列或输入的副本(这是一个数据框)。

根据@Brandt 的评论,人们可能应该确保该函数也适用于空行(这是一个奇怪的,至少没有记录的要求)。

【问题讨论】:

  • 关于你的奖金问题:l4 = lambda r: f"{r.col1}" if len(r) else "" 应该这样做。
  • 另外,当我运行你的代码时(使用我上面建议的l4),我在两种(打印/类型)情况下都会得到Series。我正在使用 Pandas v1.3.1。

标签: python pandas string


【解决方案1】:

您应该添加 result_type='reduce' 参数以避免扩展至 DataFrame:

df = pd.DataFrame(data={"col1": [], "col2": []})

l3 = lambda r: ""
l4 = lambda r: f"{r.col1}"

df["col3"] = df.apply(l3, axis=1)
df["col4"] = df.apply(l4, axis=1, result_type='reduce')

【讨论】:

  • 请注意,df.apply 在这两种情况下都有效。不工作的是分配给新列。
  • @bers 好的,知道了,这是 result_type 的问题,请参阅编辑
  • 但您仍然是对的:“当没有行时,apply 将一个空系列传递给函数。”。这只是发生在 try/catch 块中,所以我们看不到它失败 - 请参阅我更新的问题。
猜你喜欢
  • 2015-04-10
  • 2012-06-17
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
相关资源
最近更新 更多