【问题标题】:lambda function on list in dataframe column error数据框列错误列表中的 lambda 函数
【发布时间】:2020-12-03 20:47:20
【问题描述】:

我在 pandas 数据框中有一个数字列表,我正在尝试使用 lambda 函数 + 列表推导从这些列表中删除值。

col 1 col2

一个 [-1, 2, 10, 600, -10]

b [-0, -5, -6, -200, -30]

c .....

等等

df.col2.apply(lambda x: [i for i in x if i>= 0]) #just trying to remove negative values 

数字总是递增的,可以全为负数、全为正数或混合。列表大约有 200 个项目,都是整数。

我收到此错误:

TypeError: 'numpy.float64' object is not iterable

编辑:当我这样做时,它可以工作 [i for i in df[col2][#] if i >= 0] 我想我可以通过一个 for 循环来运行它。虽然看起来很慢

Edit2:用新鲜的眼光看待它。事实证明,该列并不完全由列表组成,有一些浮点值分布在各处(duh)。一旦我纠正了上面的代码按预期工作,合并发生了一些奇怪的事情。感谢您的帮助!

【问题讨论】:

  • 错误说明了您的问题。尝试将 lambda 设为变量,将列转换为列表,然后将其传递。
  • 这个错误对我来说毫无意义。 lambda x 是一个列表,为什么会有类型错误?如果我这样做:``` [i for i in df[col2][#] if i >= 0] ``` 这行得通
  • 第 2 列中的每个项目都是数字列表,还是有任何实例是单个浮点数而不是列表?
  • 我认为你错过了 apply 的工作原理
  • 查看掩码和条件

标签: python pandas numpy lambda


【解决方案1】:

因为你的 lambda 中的 x 是一个浮点数,你不能循环浮点数:p。 如果你需要这样做。你可以

In [2]: np.random.seed(4)
   ...: df = pd.DataFrame(np.random.randint(-5,5, 7)).rename(columns={0:"col2"})
   ...: df.col2 = df.col2.astype(float)
   ...: df
Out[2]: 
   col2
0   2.0
1   0.0
2  -4.0
3   3.0
4   2.0
5   3.0
6  -3.0

In [3]: df.col2.apply(lambda x: x if x > 0 else None).dropna()
Out[3]: 
0    2.0
3    3.0
4    2.0
5    3.0
Name: col2, dtype: float64

【讨论】:

  • 为什么不直接df.col2[df.col2 >= 0]
  • 因为 df.col2[df.col2 >= 0] 仅返回 >= 0 值,因此您不能将结果列附加到现有的 df,另一方面,df.col2.apply(lambda x: x if x > 0 else None) 返回相同的长度,因此您可以将其附加到现有的 df .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2010-12-15
相关资源
最近更新 更多