为什么df.apply(元组)工作但不是df.apply(list)?

cs9*_*s95 8 python list apply dataframe pandas

这是一个数据帧:

    A  B  C
0   6  2 -5
1   2  5  2
2  10  3  1
3  -5  2  8
4   3  6  2
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

但是,如果我想要一个值列表而不是它们的元组,我不能这样做,因为它没有给我我期望的东西:

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
Run Code Online (Sandbox Code Playgroud)

相反,我需要这样做:

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
Run Code Online (Sandbox Code Playgroud)

为什么我不能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
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 5

罪魁祸首就在这里.使用func=tuple它,但使用func=list引发编译模块内的异常lib.reduce:

ValueError: ('function does not reduce', 0)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,他们捕获异常但不愿意处理它.

即使没有太宽泛的except子句,这也是熊猫中的一个错误.您可能会尝试在他们的跟踪器上提升它,但类似的问题已经被关闭了一些不会修复或欺骗的味道.

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

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

后一个问题已经关闭,然后重新开放,并在几个月前转换为文档增强请求,现在似乎被用作任何相关问题的倾销场.

据推测,这不是一个高优先级,因为正如piRSquared评论的那样(其中一位熊猫维护者评论过同样的事情),你最好使用列表理解:

pd.Series([list(x) for x in df.itertuples(index=False)])
Run Code Online (Sandbox Code Playgroud)

通常apply会使用numpy ufunc或类似的.