基于多列中的条件选择数据框中的行范围

2024-09-30 20:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据不同列中的两个条件,从当前DF中的一系列行中选择并创建一个新的数据帧。下面是一个带有两列的较大DF示例。我感兴趣的是创建一个新的DF,其中的行从0列等于BEGIN_GROUP和1列等于R向下到END_GROUP R。我不能仅仅基于0列缩小它的范围,因为BEGIN_GROUP和END_GROUP在DF中重复了很多次,唯一唯一唯一唯一的是相邻列中的值(在本例中为R)。提前谢谢

                    0               1
15           compressionType        xx                     
16           jpegProfileName        xx                      
17               BEGIN_GROUP        R                 
18                     ULLon        xx            
19                     ULLat        xx           
20                     ULHAE        xx                  
21                     URLon        xx           
22                     URLat        xx             
23                     URHAE        xx                
24                     LRLon        xx            
25                     LRLat        xx             
26                     LRHAE        xx                  
27                     LLLon        xx            
28                     LLLat        xx             
29                     LLHAE        xx                  
30              absCalFactor        xx            
31        effectiveBandwidth        xx           
32                  TDILevel        xx                      
33                 END_GROUP        R                       
34               BEGIN_GROUP        G                       
35                     ULLon        xx          

Tags: 数据示例dfgroup条件感兴趣endbegin
2条回答

假设您的数据帧更大,并且实际上有一个适当的索引。要在示例中模拟此情况,请执行以下操作:

df = df.reset_index()

构建两个词典,一个带起始索引,一个带结束索引:

beginnings = df.loc[df['0'] == 'BEGIN_GROUP']['1'].to_dict()
endings = df.loc[df['0'] == 'END_GROUP']['1'].to_dict()
beginnings, endings
({17: 'R', 34: 'G'}, {33: 'R'})

现在,基于这些保存的索引构建新的数据帧:

dfs = {}
for begin_idx, begin_label in beginnings.items():
    for end_idx, end_label in endings.items():
        if begin_label == end_label:
            dfs[begin_label] = df.iloc[begin_idx:end_idx+1]

注意:这将构建一个包含数据帧的字典。您可以通过其唯一的标签来称呼它们:

dfs['R']
    index                   0   1
2      17         BEGIN_GROUP   R
3      18               ULLon  xx
4      19               ULLat  xx
5      20               ULHAE  xx
6      21               URLon  xx
7      22               URLat  xx
8      23               URHAE  xx
9      24               LRLon  xx
10     25               LRLat  xx
11     26               LRHAE  xx
12     27               LLLon  xx
13     28               LLLat  xx
14     29               LLHAE  xx
15     30        absCalFactor  xx
16     31  effectiveBandwidth  xx
17     32            TDILevel  xx
18     33           END_GROUP   R

IIUC

# boolean indexing where column 0 has begin_group OR end_group
# AND col 1 is equal to R and get the index
idx = df[((df['0'].str.contains('BEGIN_GROUP|END_GROUP')) & (df['1'] == 'R'))].index
# use .loc with the index range
df.loc[idx[0]:idx[1]]

                     0   1
17         BEGIN_GROUP   R
18               ULLon  xx
19               ULLat  xx
20               ULHAE  xx
21               URLon  xx
22               URLat  xx
23               URHAE  xx
24               LRLon  xx
25               LRLat  xx
26               LRHAE  xx
27               LLLon  xx
28               LLLat  xx
29               LLHAE  xx
30        absCalFactor  xx
31  effectiveBandwidth  xx
32            TDILevel  xx
33           END_GROUP   R

相关问题 更多 >