我尝试将一个函数应用于PandasDataFrame的所有行(实际上只是该DataFrame中的一列)
我肯定这是语法错误,但我知道我做错了什么
df['col'].apply(lambda x, y:(x - y).total_seconds(), args=[d1], axis=1)
col
列包含了一堆datetime.datetime
对象,d1
是其中最早的一个,我试图得到每一行的总秒数。
我不断收到以下错误
TypeError: <lambda>() got an unexpected keyword argument 'axis'
我不明白为什么axis
会被传递给lambda
函数
我也试过
def diff_dates(d1, d2):
return (d1-d2).total_seconds()
df['col'].apply(diff_dates, args=[d1], axis=1)
我得到了同样的错误。
2条答案
按热度按时间8zzbczxx1#
注意**
Series.apply
调用**没有axis
参数,这与DataFrame.apply
调用不同。序列.apply(函数,转换数据类型=真,参数=(),**kwds)
有一个用于df的函数,但是不清楚当你在一个序列上调用它,但是你期望它在一行上工作时,你期望它如何工作?
t1rydlwq2#
一个单列(通常)是一个Pandas系列,正如EdChum提到的,
DataFrame.apply
有axis
参数,但Series.apply
没有,所以axis=1
上的apply
对列不起作用。以下作品:
为了对行中的每个元素应用函数,也可以使用
map
:由于
apply
只是Python循环的语法糖,列表解析可能比这两种方法都更有效,因为它没有Pandas开销:对于单列 Dataframe ,可以传递
axis=1
:PSA:尽可能避免
apply
apply
在 * 大多数情况下 * 甚至不需要。对于OP中的情况(以及大多数其他情况),存在矢量化操作(只需从列中减去d1
-值被广播以匹配列),并且无论如何都比apply
快得多:计时
对于10 k行的帧,向量化减法在一列上比
apply
快大约150倍,在单列DataFrame上比apply
快7000倍以上。由于apply
是一个循环,因此随着行数的增加,这个差距会变大。