熊猫如何过滤系列

时间:2015-02-02 06:21:21

标签: python pandas

我做了groupby之后有这样的系列(' name')并在其他列上使用了mean()函数

name
383      3.000000
663      1.000000
726      1.000000
737      9.000000
833      8.166667

有人可以告诉我如何用1.000000平均值过滤掉行吗?谢谢,非常感谢您的帮助。

7 个答案:

答案 0 :(得分:86)

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

答案 1 :(得分:36)

从pandas版本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

答案 2 :(得分:19)

作为DACW pointed out,pandas 0.18.1中有method-chaining improvements可以很好地完成你想要的工作。

您可以将您的函数传递给Logger.manager索引器或系列索引器.where,而不是使用.loc,而不是调用[]

.dropna

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

答案 3 :(得分:18)

快速执行此操作的方法是使用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

答案 4 :(得分:5)

另一种方法是首先转换为DataFrame并使用query方法(假设您已安装了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")

答案 5 :(得分:5)

如果您喜欢链式操作,还可以使用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

答案 6 :(得分:1)

在我的情况下,我有一个熊猫系列,其值是字符元组

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两次;你必须将任何临时系列存储到一个变量中,这样你就可以调用apply(...)在上面)。

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

使用可链接函数的许多其他答案(包括已接受的答案):

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

这些接受适用于系列的callables(lambdas),而不是这些系列中的单个

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

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

产生错误:

KeyError:'级别H必须与名称相同(无)'

我很困惑,但它好像在使用Series.count series_of_tuples.count(...) function,这不是我想要的。

我承认替代数据结构可能更好:

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

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

series_of_tuples.apply(''.join)

所以我可以使用chainable Series.str.count

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