2016-06-21 94 views
3

考慮到與值替換楠如下:大熊貓多指標的行和列:從匹配的行

import pandas as pd 
import numpy as np 
df=pd.DataFrame({'County':['A','B','A','B','A','B','A','B','A','B'], 
       'Hospital':['a','b','e','f','i','j','m','n','b','r'], 
       'Enrollment':[44,55,95,54,81,54,89,76,1,67], 
       'Year':['2012','2012','2012','2012','2012','2013', 
         '2013','2013','2013','2013']}) 
d2=pd.pivot_table(df,index=['County','Hospital'],columns=['Year'])#.sort_columns 

d2 

     Enrollment 
     Year  2012 2013 
County Hospital   
A  a  44.0 NaN 
     b  NaN  1.0 
     e  95.0 NaN 
     i  81.0 NaN 
     m  NaN  89.0 
B  b  55.0 NaN 
     f  54.0 NaN 
     j  NaN  54.0 
     n  NaN  76.0 
     r  NaN  67.0 

如果醫院如「B」存在一次以上,它有前一年沒有數據(第一次出現'b'),我想爲其他行('b')分配上一年的註冊值,並刪除第一年不包含數據的'b'行:

 Enrollment 
     Year  2012 2013 
County Hospital   
A  a  44.0 NaN 
     b  55.0 1.0 
     e  95.0 NaN 
     i  81.0 NaN 
     m  NaN  89.0 
B  f  54.0 NaN 
     j  NaN  54.0 
     n  NaN  76.0 
     r  NaN  67.0 

到目前爲止,我可以識別重複行並刪除,但我只是堅持用值w替換NaN這裏需要:

d2=d2.reset_index()  
d2['dup']=d2.duplicated('Hospital',keep=False) 
  • 標誌,刪除,複製醫院沒有數據的最近年份:

    Hospital=d2.columns.levels[0][1] 
    
    Y1=d2.columns.levels[1][0] 
    
    Y2=d2.columns.levels[1][1] 
    
    d2['Delete']=np.nan 
    
    d2.loc[(pd.isnull(d2.Enrollment[Y2]))&(d2['dup']==True),'Delete']='Yes' 
    
    1. 重置索引後,找出重複的醫院

      保留除刪除行外的所有行:

      d2=d2.loc[d2['Delete']!='Yes'] 
      
  • 回答

    3

    如果我理解正確的,問題是醫院匹配時從縣B值複製到縣的一個。這可以用groupby/fillna(method='bfill')完成。 bfill方法以最接近的非NaN值回填NaN。

    然後,您可以使用d2.drop_duplicates(subset=['Hospital'], keep='first')在醫院匹配時保留第一行。


    例如,

    import pandas as pd 
    
    df = pd.DataFrame({'County': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'], 
            'Hospital': ['a', 'b', 'e', 'f', 'i', 'j', 'm', 'n', 'b', 'r'], 
            'Enrollment': [44, 55, 95, 54, 81, 54, 89, 76, 1, 67], 
            'Year': ['2012', '2012', '2012', '2012', '2012', '2013', 
              '2013', '2013', '2013', '2013']}) 
    d2 = pd.pivot_table(df, index=['County', 'Hospital'], columns=['Year']) 
    d2 = d2.groupby(level='Hospital').fillna(method='bfill') 
    d2 = d2.reset_index() 
    d2 = d2.drop_duplicates(subset=['Hospital'], keep='first') 
    

    產生

     County Hospital Enrollment  
    Year      2012 2013 
    0   A  a  44.0 NaN 
    1   A  b  55.0 1.0 
    2   A  e  95.0 NaN 
    3   A  i  81.0 NaN 
    4   A  m  NaN 89.0 
    6   B  f  54.0 NaN 
    7   B  j  NaN 54.0 
    8   B  n  NaN 76.0 
    9   B  r  NaN 67.0 
    
    +0

    關閉,但醫院行保留的標準是基於哪一方缺乏第一年的數據,並且有第二年的數據(滿足這兩個標準的那一個是保留的數據)。 –

    1

    操縱d2AB並排放置。

    e = d2.unstack(0).swaplevel(1, 2, 1).sort_index(1).Enrollment 
    print e 
    
    County  A   B  
    Year  2012 2013 2012 2013 
    Hospital       
    a   44.0 NaN NaN NaN 
    b   NaN 1.0 55.0 NaN 
    e   95.0 NaN NaN NaN 
    f   NaN NaN 54.0 NaN 
    i   81.0 NaN NaN NaN 
    j   NaN NaN NaN 54.0 
    m   NaN 89.0 NaN NaN 
    n   NaN NaN NaN 76.0 
    r   NaN NaN NaN 67.0 
    

    創建一個應用函數從B賦值並註銷B之後。

    def manipulate_rows(row): 
        if pd.notnull(row.loc['A'].iloc[1]) & pd.isnull(row.loc['A'].iloc[0]): 
         row.A = row.A.combine_first(row.B) 
         row.B = np.nan 
        return row 
    
    d3 = e.apply(manipulate_rows, axis=1).stack(0).swaplevel(0, 1).sort_index() 
    

    疊加後自然會丟失數據透視後的缺失值。

    重新分配d2

    d3.columns = d2.columns 
    
    print d3 
    
           Enrollment  
    Year     2012 2013 
    County Hospital     
    A  a    44.0 NaN 
         b    55.0 1.0 
         e    95.0 NaN 
         i    81.0 NaN 
         m    NaN 89.0 
    B  f    54.0 NaN 
         j    NaN 54.0 
         n    NaN 76.0 
         r    NaN 67.0 
    
    +0

    幾乎肯定從'.swaplevel(1,2,1)'部到來。在'.unstack(0)'之後。它意味着你調用這個數據幀,它的索引只有一個級別,這意味着你在錯誤的數據框上調用了它,或者它與問題中表示的不同。 – piRSquared

    +0

    你是對的;我忘了我已經將reset_index()添加到了我的原始代碼中。關於函數定義中的row.loc ['A'];有沒有辦法避免提到標籤本身?重複行可能發生在n個組中的任何一組中。 –

    +0

    目前,我認爲我不得不重做邏輯。 'row.loc ['A']'正在利用'loc'處理'MultiIndex'的好處。一個即時的解決方法是傳遞列名:'def manipulate_row(row,to ='A',from ='B')'或類似的東西。 – piRSquared