pandas 如何通过连续值和条件过滤一个嵌套框架?

nbysray5  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(114)

我有一个这样的pandas dataframe:

df = pd.DataFrame({'a':[1, 1, 1, 2, 1, 3, 1, 1, 4, 4, 5, 5, 5, 6, 6, 3]})

>>> df
    a
0   1
1   1
2   1
3   2
4   1
5   3
6   1
7   1
8   4
9   4
10  5
11  5
12  5
13  6
14  6
15  3

我想保留列“a”中连续出现且小于或等于5的重复值。
该索引的数组保持应该是行0,1,2,6,7,8,9,10,11,12。
如何以Python的方式做到这一点?
结果应该是这样的:

a
0   1
1   1
2   1
6   1
7   1
8   4
9   4
10  5
11  5
12  5
ztmd8pv5

ztmd8pv51#

感谢@mozway的edit,这里有另一个可能的mask/duplicated选项:

s = df["a"].mask(df["a"].gt(5))

out = df.loc[s.ne(s.shift()).cumsum().duplicated(keep=False)]

输出量:

print(out)

    a
0   1
1   1
2   1
6   1
7   1
8   4
9   4
10  5
11  5
12  5
35g0bw71

35g0bw712#

使用较小的值过滤consetive值,如boolean indexing中的5

s = df['a'].ne(df['a'].shift()).cumsum()
out = df[s.map(s.value_counts()).gt(1) & df['a'].le(5)]
print (out)

    a
0   1
1   1
2   1
6   1
7   1
8   4
9   4
10  5
11  5
12  5
vwoqyblh

vwoqyblh3#

我也写了一些丑陋的代码,也工作了。但它根本不是Python的。

>>> df[((df.a == df.a.shift())|(df.a == df.a.shift(-1)))&(df.a.le(5))]
    a
0   1
1   1
2   1
6   1
7   1
8   4
9   4
10  5
11  5
12  5

>>> df[(df.a.diff().eq(0)|df.a.diff(-1).eq(0))&df.a.le(5)]
    a
0   1
1   1
2   1
6   1
7   1
8   4
9   4
10  5
11  5
12  5

根据@mozway的建议,我使用了.eq而不是==。

vybvopom

vybvopom4#

您可以使用groupby.transform,但在您的情况下,您似乎更希望将至少2个值且不超过5个值的组作为值进行过滤:

# consecutive values
m1 = df.groupby(df['a'].ne(df['a'].shift()).cumsum()).transform('size').gt(1)
# less or equal to 5
m2 = df['a'].le(5)

out = df[m1&m2]

或者不使用groupby但使用shift

# consecutive values
m0 = df['a'].diff().eq(0)
m1 = m0|m0.shift(-1)

# less or equal to 5
m2 = df['a'].le(5)

out = df[m1&m2]

输出量:

a
0   1
1   1
2   1
6   1
7   1
8   4
9   4
10  5
11  5
12  5

中间体:

第一步
  • m1:连续值
  • m2:小于或等于5的值
a     m1     m2
0   1   True   True
1   1   True   True
2   1   True   True
3   2  False   True
4   1  False   True
5   3  False   True
6   1   True   True
7   1   True   True
8   4   True   True
9   4   True   True
10  5   True   True
11  5   True   True
12  5   True   True
13  6   True  False
14  6   True  False
15  3  False   True

第二种方法

  • m0:与先前值相同
  • m1:与上一个或下一个值相同
  • m2:等于或小于5
a     m0     m1     m2
0   1  False   True   True
1   1   True   True   True
2   1   True   True   True
3   2  False  False   True
4   1  False  False   True
5   3  False  False   True
6   1  False   True   True
7   1   True   True   True
8   4  False   True   True
9   4   True   True   True
10  5  False   True   True
11  5   True   True   True
12  5   True   True   True
13  6  False   True  False
14  6   True   True  False
15  3  False  False   True

相关问题