首页 > 解决方案 > 根据多列的条件在 Pandas 数据框中选择一系列行

问题描述

我正在尝试根据不同列中的两个条件从当前 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          

标签: pythonpandas

解决方案


假设您的数据框更大并且实际上具有适当的索引。在示例中对此进行模拟:

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

推荐阅读