【问题标题】:Pandas Filter function returned a Series, but expected a scalar boolPandas 过滤器函数返回一个系列,但需要一个标量布尔值
【发布时间】:2015-01-18 16:11:48
【问题描述】:

我正在尝试在 pandas 数据帧上使用过滤器来过滤掉与重复值匹配的所有行(当存在重复时需要删除所有行,而不仅仅是第一个或最后一个)。

这就是我在编辑器中所拥有的:

df = df.groupby("student_id").filter(lambda x: x.count() == 1)

但是当我运行包含这段代码的脚本时,我得到了错误:

TypeError:过滤器函数返回一个系列,但期望一个标量布尔

我通过在尝试应用过滤器之前连接其他两个帧来创建数据帧。

【问题讨论】:

  • 我非常怀疑控制台和 IDE/编辑器之间存在功能差异。尝试在干净的控制台/会话中重新运行。

标签: python pandas filter series


【解决方案1】:

应该是:

In [32]: grouped = df.groupby("student_id")

In [33]: grouped.filter(lambda x: x["student_id"].count()==1)

更新:

我不确定你提到的有关交互式控制台的问题。从技术上讲,在这种特殊情况下(可能存在其他情况,例如复杂的“导入”功能,其中 diff env 可能表现不同),控制台(例如 ipython)应该与其他环境(orig python env,或一些IDE内嵌一)

理解 pandas groupby 的一种直观方法是将 DataFrame.groupby() 的返回 obj 视为数据帧列表。因此,当您尝试使用过滤器将 lambda 函数应用于 x 时,x 实际上是这些数据帧之一:

In[25]: df = pd.DataFrame(data,columns=year)

In[26]: df

Out[26]: 
   2013  2014
0     0     1
1     2     3
2     4     5
3     6     7
4     0     1
5     2     3
6     4     5
7     6     7

In[27]: grouped = df.groupby(2013)

In[28]: grouped.count()

Out[28]: 
      2014
2013      
0        2
2        2
4        2
6        2

在此示例中,分组 obj 中的第一个数据帧将是:

In[33]: df1 = df.ix[[0,4]]

In[34]: df1

Out[33]: 
   2013  2014
0     0     1
4     0     1

【讨论】:

  • 谢谢!关于为什么它可以在交互式编辑器中工作而不是在命令行运行的脚本中的任何见解?
  • 对于更复杂的情况我不得不使用.apply()stackoverflow.com/questions/23394476/…
【解决方案2】:

使用pd.DataFrame.drop_duplicates() 方法怎么样?

Documentation.

您确定要删除所有行吗?不是n-1?

【讨论】:

  • 是的,我必须删除所有重复项,而不是 n-1。否则数据可能会被错误地归咎于错误的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 2022-01-09
  • 2011-06-15
  • 2011-03-14
相关资源
最近更新 更多