我想知道为什么 pandas 以不同的方式对待两个 lambda
l3
和 l4
- 都接受一个参数,都返回一个字符串,并且都永远不应该被执行,因为 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)
这适用于空数据框吗?
更新:我相信 pandas 代码的相关部分是这样的:
根据@mozway 的回答,该函数应用于一个空系列,并根据这是否有效,返回生成的新系列或输入的副本(这是一个数据框)。
根据@Brandt 的评论,可能应该确保该函数也适用于空行(这是一个奇怪的,至少是未记录的要求)。
最佳答案
您应该添加 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')
关于python - 为什么 pandas 在 `apply` 中对这两个字符串的处理方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69041513/