我做了groupby之后有这样的系列(' name')并在其他列上使用了mean()函数
name
383 3.000000
663 1.000000
726 1.000000
737 9.000000
833 8.166667
有人可以告诉我如何用1.000000平均值过滤掉行吗?谢谢,非常感谢您的帮助。
答案 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
天真的时间
答案 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,这不是我想要的。
我承认替代数据结构可能更好:
这会创建一系列字符串(即通过连接元组;将元组中的字符连接到单个字符串上)
series_of_tuples.apply(''.join)
所以我可以使用chainable Series.str.count
series_of_tuples.apply(''.join).str.count('H')==1