我不明白为什么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的评论,可能应该确保该函数也适用于空行(这是一个奇怪的、至少未记录的要求)。 https://github.com/pandas-dev/pandas/blob/8e07787bc1030e5d13d3ad5e83b5d060a519ef67/pandas/core/apply.py#L718-L753
l4 = lambda r: f"{r.col1}" if len(r) else ""
应该可以解决。 - Brandtl4
)时,在两种情况下(print/type),我都得到了Series
。我正在使用Pandas v1.3.1。 - Brandt