【发布时间】:2021-11-01 14:15:24
【问题描述】:
我想知道为什么 pandas 以不同的方式对待两个 lambdas 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)
适用于空数据框?
更新:我相信熊猫代码的相关部分是这样的:
根据@mozway 的回答,该函数应用于一个空系列,并根据它是否有效,返回生成的新系列或输入的副本(这是一个数据框)。
根据@Brandt 的评论,人们可能应该确保该函数也适用于空行(这是一个奇怪的,至少没有记录的要求)。
【问题讨论】:
-
关于你的奖金问题:
l4 = lambda r: f"{r.col1}" if len(r) else ""应该这样做。 -
另外,当我运行你的代码时(使用我上面建议的
l4),我在两种(打印/类型)情况下都会得到Series。我正在使用 Pandas v1.3.1。