如何打印某列中特定值上下的行
我有一个分类变量,在某一列中用数字“777”表示。我想要做的是,当在这一列中找到777时,打印出它上面和下面各3行的内容。现在我只能打印出它上面和下面各1行,我该怎么做才能打印出3行,或者其他任意数量的行呢?
m = df['ResetPoint'] == 777
df = df[m.shift(-1)|m.shift()|m]
2 个回答
0
你基本上可以用你已有的东西写一个循环。
我假设 n
(上下文的行数)不会很大,所以性能方面的问题不需要担心。
mask = m.copy()
n = 3
for i in range(1, n+1):
mask |= m.shift(-i) # above
mask |= m.shift(i) # below
举个例子:
df = pd.DataFrame({'ResetPoint': list(range(10))})
df.loc[4, 'ResetPoint'] = 777
df
ResetPoint
0 0
1 1
2 2
3 3
4 777
5 5
6 6
7 7
8 8
9 9
...
df[mask]
ResetPoint
1 1
2 2
3 3
4 777
5 5
6 6
7 7
0
对于多个重置值的情况,一种方法是先找到值为777的行的索引,然后使用.loc
来创建一个临时列,标记出要保留的行,最后用这个标记来切割数据框(DF)。下面是一个简化的例子。.loc
中使用的限制条件可以根据需要进行调整。我假设你想保留777列,否则代码可以简单修改一下。
import pandas as pd
data = [x for x in range(20)]
df = pd.DataFrame({'ResetPoint': data, 'y': data})
#set two arbitrary reset points
df.loc[5, 'ResetPoint'] = 777
df.loc[13, 'ResetPoint'] = 777
m = (df[df['ResetPoint'] == 777]).index
#create temp column and set to 1 for rows to keep, else 0
df['temp'] = 0
for idx in m:
df.loc[idx-3:idx+3, 'temp'] = 1
df = df[df['temp']>0].drop('temp', axis = 1)
print(df)
结果是:
ResetPoint y
2 2 2
3 3 3
4 4 4
5 777 5
6 6 6
7 7 7
8 8 8
10 10 10
11 11 11
12 12 12
13 777 13
14 14 14
15 15 15
16 16 16