pandas 使用规则从 Dataframe 过滤切片

fae0ux8s  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(128)

我想创建一个新的dataframe基础上的规则与片从输入dataframe。
例如:
1.切片具有关键字“JACK”。
1.起始行在“JACK”行上方1行。
1.最后一行是“JACK”行下面的2行。
1.“JACK”关键字可以在同一列或同一行中。
1.输出列可以重复。
验证码:

import pandas as pd
      
data = {
    'col0': [
        'A','JACK','C','D','E','JACK','G','H'],
    'col1': [
        'A','B','C','D','JACK','F','G','H'],
    'col2': [
        'A','B','C','D','E','F','G','H'],
    'col3': [
        'A','B','C','JACK','E','F','G','H'],
    'col4': [
        'A','B','C','JACK','E','F','G','H'],
    'col5': [
        'A','JACK','C','D','E','F','G','H'],
}

df = pd.DataFrame(data)
print(df)

异常输出:

col0  col1 col2  col3  col4  col5
0     A     A    A     A     A     A
1  JACK     B    B     B     B  JACK
2     C     C    C     C     C     C
3     D     D    D  JACK  JACK     D
4     E  JACK    E     E     E     E
5  JACK     F    F     F     F     F
6     G     G    G     G     G     G
7     H     H    H     H     H     H

   case0 case1 case3 case4 case5 col5
0     A     E     D     C     C    A
1  JACK  JACK  JACK  JACK  JACK JACK
2     C     G     F     E     E    C
3     D     H     G     F     F    D
ql3eal8s

ql3eal8s1#

我在这里使用numpy:

before = 1
after = 2
n = before+after+1

# get indices of JACK
col, idx = np.where(df.eq('JACK').T)

# raveld index
pos = idx+col*df.shape[0]

# keep only full slices
m = (idx>=before) & (idx<=df.shape[0]-after)

# get all indices (1 before, 2 after)
keep = (pos[m][:,None]-before+np.arange(n)).ravel()

# slice and convert to DataFrame
out = pd.DataFrame(df.to_numpy().ravel('F')[keep].reshape(-1, n).T)

输出:

0     1     2     3     4     5
0     A     E     D     C     C     A
1  JACK  JACK  JACK  JACK  JACK  JACK
2     C     G     F     E     E     C
3     D     H     G     F     F     D
qncylg1j

qncylg1j2#

这里有一个方法:

df2 = df.where(df.eq('JACK').where(df.eq('JACK')).bfill(limit=1).ffill(limit=2)).stack().to_frame().assign(cc = lambda x: x.groupby(level=1).cumcount())

df2 = df2.set_index(list(divmod(df2.pop('cc'),4)),append=True)
df2 = df2.set_index(d.groupby(level=[1,2]).ngroup(),append=True)[0]
df2 = df2.droplevel([0,1,2]).unstack()

输出:

0     1     2     3     4     5
cc                                    
0      A     E     D     C     C     A
1   JACK  JACK  JACK  JACK  JACK  JACK
2      C     G     F     E     E     C
3      D     H     G     F     F     D

相关问题