熊猫如何过滤系列

Kie*_*yen 66 python pandas

在执行groupby('name')之后我有一个这样的系列,并在其他列上使用mean()函数

name
383      3.000000
663      1.000000
726      1.000000
737      9.000000
833      8.166667
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我如何过滤出1.000000平均值的行?谢谢你,我非常感谢你的帮助.

And*_*rew 97

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
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢下面的答案,因为它们可以被链接(即不需要定义`s`然后在表达式中使用它两次).仅适用于熊猫0.18. (6认同)

DAC*_*ACW 42

从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()
Run Code Online (Sandbox Code Playgroud)

结帐:http: //pandas.pydata.org/pandas-docs/version/0.18.1/whatsnew.html#method-chaininng-improvements

  • 方法链更好(让我想起 Spark。) (3认同)
  • 确实如此,但 Spark 在这种情况下做了一些更直观的事情:它只是删除了与谓词不匹配的行,这意味着不使用“.dropna()”部分,在我阅读文档之前,这对我来说显然是多余的。被它咬了:D (2认同)

Gor*_*ean 28

正如DACW所指出的那样,pandas 0.18.1 中的方法链改进可以很好地完成你正在寻找的东西.

.where您可以将函数传递给.loc索引器或系列索引器[],而不是使用它,并避免调用.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]
Run Code Online (Sandbox Code Playgroud)

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

  • 这是我最喜欢的答案,而且它似乎也是最快的,而无需归结为 numpy(请参阅时间比较)。 (2认同)

piR*_*red 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
Run Code Online (Sandbox Code Playgroud)

天真的时机

在此输入图像描述


ksi*_*ndi 6

另一种方法是首先转换为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")
Run Code Online (Sandbox Code Playgroud)

  • 这会增加数据帧的所有开销,并且速度会非常慢。 (2认同)

Psi*_*dom 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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,自版本 0.24.0 起,`pandas.Series.compress` 已被弃用。的“熊猫”。 (2认同)