熊猫如何过滤系列

在执行 groupby (‘ name’)和在其他列上使用 mean ()函数之后,我得到了一个类似的 Series

name
383      3.000000
663      1.000000
726      1.000000
737      9.000000
833      8.166667

有人能告诉我如何过滤出平均值为1.000000的行吗?谢谢,非常感谢你的帮助。

193888 次浏览
In [5]:


import pandas as pd


test = {
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
}


s = pd.Series(test)
s = s[s != 1]
s
Out[0]:
383    3.000000
737    9.000000
833    8.166667
dtype: float64

另一种方法是首先转换为 DataFrame 并使用 疑问方法(假设您已经安装了 numexpr) :

import pandas as pd


test = {
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
}


s = pd.Series(test)
s.to_frame(name='x').query("x != 1")

从熊猫版本0.18 + 过滤一系列也可以做到如下

test = {
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
}


pd.Series(test).where(lambda x : x!=1).dropna()

退房: Http://pandas.pydata.org/pandas-docs/version/0.18.1/whatsnew.html#method-chaininng-improvements

作为 DACW 指出,有 方法链式改进方法链式改进方法熊猫0.18.1做你正在寻找非常好。

与使用 .where不同,您可以将函数传递给 .loc索引器或 Series 索引器 [],并避免调用 .dropna:

test = pd.Series({
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
})


test.loc[lambda x : x!=1]


test[lambda x: x!=1]

DataFrame 和 NDFrame 类支持类似的行为。

如果你喜欢链式操作,你也可以使用 compress函数:

test = pd.Series({
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
})


test.compress(lambda x: x != 1)


# 383    3.000000
# 737    9.000000
# 833    8.166667
# dtype: float64

实现这一点的一个快速方法是使用 numpy重新构建以切割底层数组。

mask = s.values != 1
pd.Series(s.values[mask], s.index[mask])


0
383    3.000000
737    9.000000
833    8.166667
dtype: float64

天真的时机

enter image description here

在我的案例中,我有一个 熊猫系列,其中的值是字符的元组:

Out[67]
0    (H, H, H, H)
1    (H, H, H, T)
2    (H, H, T, H)
3    (H, H, T, T)
4    (H, T, H, H)

因此,我可以使用索引来过滤序列,但是要创建索引,我需要 apply。我的条件是“查找所有正好有一个‘ H’的元组”。

series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]

我承认它是 不是“锁链”,(也就是说,注意我重复了 series_of_tuples两次; 您必须将任何临时序列存储到一个变量中,以便您可以对它调用 application (...))。

也可能有 其他方法(除 .apply(...)以外)可以 以元素方式操作以产生布尔索引。

许多其他的答案(包括已接受的答案)都使用了链式函数,例如:

  • .compress()
  • .where()
  • .loc[]
  • []

这些接受可调用(lambdas) 适用于系列,而不是那些系列中的单个 价值观

因此,当我尝试使用上述条件/可调用/lambda 和任何可链接函数(如 .loc[])时,我的系列元组表现得很奇怪:

series_of_tuples.loc[lambda x: x.count('H')==1]

产生错误:

键错误: ‘级别 H 必须与名称(无)相同’

我很困惑,但它似乎是使用的 Count series_of_tuples.count(...)函数,这不是我想要的。

我承认,另一种数据结构可能更好:

  • 分类数据类型?
  • 数据框架(元组的每个元素都成为一列)
  • 一系列字符串(只需将元组连接在一起) :

这将创建一系列字符串(即通过连接元组; 将元组中的字符连接到一个字符串上)

series_of_tuples.apply(''.join)

所以我可以使用 链式 Series.str.count

series_of_tuples.apply(''.join).str.count('H')==1