繁体   English   中英

为什么df.apply(tuple)有效但df.apply(list)不起作用?

[英]Why does df.apply(tuple) work but not df.apply(list)?

这是一个数据框:

    A  B  C
0   6  2 -5
1   2  5  2
2  10  3  1
3  -5  2  8
4   3  6  2

我可以使用df.apply从原始df检索基本上是一列元组的列:

out = df.apply(tuple, 1)
print(out)

0    (6, 2, -5)
1     (2, 5, 2)
2    (10, 3, 1)
3    (-5, 2, 8)
4     (3, 6, 2)
dtype: object

但是,如果我想要一个值列表而不是它们的元组,那我就做不到,因为它不能满足我的期望:

out = df.apply(list, 1)
print(out)

    A  B  C
0   6  2 -5
1   2  5  2
2  10  3  1
3  -5  2  8
4   3  6  2

相反,我需要这样做:

out = pd.Series(df.values.tolist())
print(out)

0    [6, 2, -5]
1     [2, 5, 2]
2    [10, 3, 1]
3    [-5, 2, 8]
4     [3, 6, 2]
dtype: object

为什么我不能使用df.apply(list, 1)来获得我想要的东西?


附录

一些可能的解决方法的时间安排:

df_test = pd.concat([df] * 10000, 0)

%timeit pd.Series(df.values.tolist()) # original workaround
10000 loops, best of 3: 161 µs per loop

%timeit df.apply(tuple, 1).apply(list, 1) # proposed by Alexander
1000 loops, best of 3: 615 µs per loop

罪魁祸首在这里 使用func=tuple可以工作,但是使用func=list会在编译模块lib.reduce func=list引发异常:

ValueError: ('function does not reduce', 0)

如您所见,它们捕获了异常,但没有费心去处理它。

即使没有太宽泛的except子句, 这也是pandas中的一个错误 您可能会尝试在其跟踪器上提出该问题,但类似问题已经解决,但无法解决某些问题。

16321:使用apply()基于当前列创建列表的奇怪行为

15628:当reduce = True时,Dataframe.apply并不总是返回Series

后者的问题已关闭,然后重新打开,并在几个月前转换为docs增强请求,现在似乎已被用作任何相关问题的垃圾场。

大概这不是一个高优先级,因为正如piRSquared所评论 (和一位熊猫维护者所评论的一样 ),您最好使用列表理解功能:

pd.Series([list(x) for x in df.itertuples(index=False)])

通常, apply使用numpy ufunc或类似方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM