当前位置: 首页 > 面试题库 >

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

闽承望
2023-03-14
问题内容

这是一个数据框:

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

我可以获取列基本上是从原来的列的元组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

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

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它就可以了,但是usingfunc=list在编译模块中引发了一个异常lib.reduce

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
或类似的东西。



 类似资料:
  • 问题内容: 这是一个数据框: 我可以获取列基本上是从原来的列的元组df使用df.apply: 但是,如果我想要一个值列表而不是它们的元组,那我就做不到,因为它不能满足我的期望: 相反,我需要这样做: 为什么我不能使用df.apply(list, 1)我想要的东西? 附录 一些可能的解决方法的时间安排: 问题答案: 罪魁祸首在这里。有了它就可以了,但是在编译模块中引发了一个异常: 如您所见,它们捕获

  • 问题内容: 我正在为Python学习win32com,但遇到了一个奇怪的问题。 我正在尝试在词典列表中导出Outlook联系人。我的代码与win32com.client.Dispatch(“ Outlook.Application)完美配合。但是它与win32com.client.gencache.EnsureDispatch(” Outlook.Application)返回0个联系人,该联系人应

  • 问题内容: 我正在尝试从JSON网址获取集合。骨干网确实发送了请求并得到了响应,但是在它之后的集合中没有: 这是我的JavaScript: 响应中的JSON 响应中的Content-Type HTTP标头为。 为什么不将其加载到集合中?JSON是否正确? 一些更多的代码: 问题答案: 是异步的。尝试 要么 要么

  • 问题内容: 我有三部分字符串,每个部分用 符号分隔 。例如, 现在,当我使用这样的方法拆分它时: 它包含整个字符串作为单个元素的数组。 但是当我使用这个: 它完美的作品是什么,我想这意味着 现在的数组包含,并分别对指数0,1和2。 我想知道为什么第一次使用时不起作用,因为我在使用 问题答案: 因为字符是在正则表达式中用来标记行尾的保留令牌。因此,您必须使用进行 转义。

  • 问题内容: 我现在有点困惑。我尝试过: 并得到: 但是,我想要: 我的代码有什么问题? 问题答案: 您没有将其分配给。字符串是 不可变的 。 您需要将其分配回。

  • 问题内容: 我正在尝试这样做: 第一行有效: 但是接下来的两个: 和 只是输出 为什么? 问题答案: 因为你需要加入同,只是列出了内容直接,内容不具有完整路径。 范例- 如果未提供完整路径,则在当前目录中搜索,因此当您给出时,将获得正确的列表。 范例- 假设某个文件夹-具有文件-并在其中。 当您执行-时,返回的列表类似于- 即使您在其中提供绝对路径,列表中返回的文件也将具有指向目录的相对路径。您将