【问题标题】:Why is pandas.DataFrame.apply printing out junk?为什么 pandas.DataFrame.apply 打印出垃圾?
【发布时间】:2018-02-18 14:41:58
【问题描述】:

考虑这个简单的数据框:

   a  b
0  1  2
1  2  3

我这样执行.apply

In [4]: df.apply(lambda x: [x.values])
Out[4]: 
a    [[140279910807944, 140279910807920]]
b    [[140279910807944, 140279910807920]]
dtype: object

In [5]: df.apply(lambda x: [x.values])
Out[5]: 
a    [[37, 37]]
b    [[37, 37]]
dtype: object

In [6]: df.apply(lambda x: [x.values])
Out[6]: 
a    [[11, 11]]
b    [[11, 11]]
dtype: object

为什么 pandas 每次都打印出垃圾?

我已在 v0.20 中验证了这种情况。

编辑:寻找答案,而不是解决方法。

【问题讨论】:

  • df.apply(lambda x: [x])相同。
  • 与单行数据框相同:df1=pd.DataFrame({'a':[1],'b':[2]})df1.apply(lambda x: [x],axis=1) 输出:0 [[0, 0]]
  • @DYZ 谢谢。所以这不仅仅是我的机器在装傻。
  • 干得好打破apply...现在你必须修复它!
  • @piRSquared 有兴趣看看这是否是一个错误...... :p(那我不在乎)

标签: python pandas dataframe apply


【解决方案1】:

我没有答案......只是一个解决方法

f = lambda x: x.values.reshape(1, -1).tolist()

df.apply(f)

a    [[1, 2]]
b    [[2, 3]]
dtype: object

我追踪到pd.lib.reduce

pd.lib.reduce(df.values, lambda x: [list(x)])

array([list([[1, 2]]), list([[2, 3]]), list([['a', 'b']])], dtype=object)

对比

pd.lib.reduce(df.values, lambda x: [x])

array([list([array([None, None], dtype=object)]),
       list([array([None, None], dtype=object)]),
       list([array([None, None], dtype=object)])], dtype=object)

【讨论】:

  • 到目前为止,我在主 [code][1] 中从 _apply_raw 方法检查了同样的事情。我认为这是 np.apply_along_axis 中混合数据类型的问题。但它是reduce。非常好。 [1]:github.com/pandas-dev/pandas/blob/…
【解决方案2】:

看起来像bug,所以打开Issue 17487

为我工作添加tolist:

print (df.apply(lambda x: [x.values.tolist()]))
a    [[1, 2]]
b    [[2, 3]]
dtype: object

print (df.apply(lambda x: [list(x.values)]))
a    [[1, 2]]
b    [[2, 3]]
dtype: object

【讨论】:

  • 是的...解决方法没问题。我的问题是为什么??
  • 是的,好问题 - 我完全不知道 - 但它看起来像错误。
  • 感谢您打开这个问题。如果它真的是一个错误,我认为这是我们能找到的唯一方法。
  • 也谢谢你 - 如果问题得到解释,我会编辑答案。
【解决方案3】:

另一种解决方法:

df.apply(lambda x: [list(x)])

【讨论】:

    最近更新 更多