在数据帧上迭代loc

时间:2018-01-11 12:06:48

标签: python pandas

我正在尝试从数据框列表中提取数据并提取行范围。每个数据帧可能没有相同的数据,因此我有一个可能的索引范围列表,我想要循环,即从下面的代码示例,我可能想要CIN到LAN,但在另一个数据帧,CIN行不不存在,所以我会想要局域网或局域网局域网。

所以我想把它们放在一个列表中并迭代列表,即

for df in dfs: ranges=[[df.loc["CIN":"LAN"]], [df.loc["DET":"LAN"]]] extracted ranges = (i for i in ranges)

我不确定如何迭代列表并将其输入loc,或者也许.query()。

  df1        stint    g    ab    r    h  X2b  X3b  hr    rbi    sb   cs   bb  \
year team                                                                    
2007 CIN       6  379   745  101  203   35    2  36  125.0  10.0  1.0  105   
     DET       5  301  1062  162  283   54    4  37  144.0  24.0  7.0   97   
     HOU       4  311   926  109  218   47    6  14   77.0  10.0  4.0   60   
     LAN      11  413  1021  153  293   61    3  36  154.0   7.0  5.0  114   
     NYN      13  622  1854  240  509  101    3  61  243.0  22.0  4.0  174   
     SFN       5  482  1305  198  337   67    6  40  171.0  26.0  7.0  235   
     TEX       2  198   729  115  200   40    4  28  115.0  21.0  4.0   73   
     TOR       4  459  1408  187  378   96    2  58  223.0   4.0  2.0  190   

  df2           so   ibb   hbp    sh    sf  gidp  
year team                                       
2008 DET   176.0   3.0  10.0   4.0   8.0  28.0  
     HOU   212.0   3.0   9.0  16.0   6.0  17.0  
     LAN   141.0   8.0   9.0   3.0   8.0  29.0  
     NYN   310.0  24.0  23.0  18.0  15.0  48.0  
     SFN   188.0  51.0   8.0  16.0   6.0  41.0  
     TEX   140.0   4.0   5.0   2.0   8.0  16.0  
     TOR   265.0  16.0  12.0   4.0  16.0  38.0  

1 个答案:

答案 0 :(得分:1)

这是一个解决方案:

    import pandas as pd

    # Prepare a list of ranges
    ranges = [('CIN','LAN'), ('DET','LAN')]

    # Declare an empty list of data frames and a list with the existing data frames
    df_ranges = []
    df_list = [df1, df2]

    # Loop over multi-indices
    for i, idx_range in enumerate(ranges):
        df = df_list[i]
        row1, row2 = idx_range
        df_ranges.append(df.loc[(slice(None), slice(row1, row2)),:])

    # Print the extracted data
    print('Extracted data:\n')
    print(df_ranges)

输出:

    [           stint    g    ab    r    h  X2b  X3b  hr  rbi  sb  cs   bb
    year team                                                            
    2007 CIN       6  379   745  101  203   35    2  36  125  10   1  105
         DET       5  301  1062  162  283   54    4  37  144  24   7   97
         HOU       4  311   926  109  218   47    6  14   77  10   4   60
         LAN      11  413  1021  153  293   61    3  36  154   7   5  114 

                so  ibb  hbp  sh  sf  gidp
    year team                             
    2008 DET   176    3   10   4   8    28
         HOU   212    3    9  16   6    17
         LAN   141    8    9   3   8    29]