如何打印某列中特定值上下的行

0 投票
2 回答
63 浏览
提问于 2025-04-13 20:43

我有一个分类变量,在某一列中用数字“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

撰写回答