繁体   English   中英

如何在列的两个值之间选择数据框中的所有行

[英]How to select all rows in a dataframe between two values of column

我有一个这样的数据框:

import numpy as np
import pandas as pd

df=pd.DataFrame([['travail','hk','hj'],['test',6,6],[5,5,8],[4,3,1],['moyenne',5,6],[5,6,7],
         [1,2,3],['travail','test','kkj'],[5,'hjjd',8],['moyenne',6,7],[5,5,8],[4,3,1],['hkk',5,6],[5,5,8],
         [7,8,5]],columns=['A','B','C'])

我想选择 A 列中travailmoyennee之间的所有行并获得:

         A     B    C
0   travail    hk   hj
1      test     6    6
2         5     5    8
3         4     3    1
4   moyenne     5    6
7   travail  test  kkj
8         5  hjjd    8
9   moyenne     6    7

我怎样才能做到这一点?

通过Series.eq ( == ) 比较列,通过 Series.iloc 进行第二次更改排序,获取Series.cumsum并通过Series.iloc ( > ) 再次Series.gt ,通过&进行按位AND的链掩码,最后通过boolean indexing进行过滤:

m1 = df['A'].eq('travail').cumsum().gt(0)
m2 = df['A'].eq('moyenne').iloc[::-1].cumsum().gt(0)

df1 = df[m1 & m2]
print (df1)
         A     B    C
0  travail    hk   hj
1     test     6    6
2        5     5    8
3        4     3    1
4  moyenne     5    6
5        5     6    7
6        1     2    3
7  travail  test  kkj
8        5  hjjd    8
9  moyenne     6    7

如果始终存在A列中的两个值,则可以使用Series.idxmaxDataFrame.loc

a = df['A'].eq('travail').idxmax()
b = df['A'].eq('moyenne').iloc[::-1].idxmax()

df1 = df.loc[a:b]

可以使用带有ilocfor循环来检查每一行并将所需块中的行附加到新的空数据帧:

newdf = pd.DataFrame(columns=df.columns)
flag = False
for i in range(len(df)): 
    firstval = df.iloc[i,0]
    if firstval == 'travail': 
        newdf = newdf.append(df.iloc[i,:])
        flag = True
    elif firstval == 'moyenne':
        newdf = newdf.append(df.iloc[i,:])
        flag = False
    elif flag==True: 
        newdf = newdf.append(df.iloc[i,:])
print(newdf)

输出:

         A     B    C
0  travail    hk   hj
1     test     6    6
2        5     5    8
3        4     3    1
4  moyenne     5    6
7  travail  test  kkj
8        5  hjjd    8
9  moyenne     6    7

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM