簡體   English   中英

Pandas:在 MultiIndex 中的每個索引后添加一個空行 dataframe

[英]Pandas: Add an empty row after every index in a MultiIndex dataframe

考慮下面df

              IA1  IA2  IA3
Name Subject               
Abc  DS        45   43   34
     DMS       43   23   45
     ADA       32   46   36
Bcd  BA        45   35   37
     EAD       23   45   12
     DS        23   35   43
Cdf  EAD       34   33   23
     ADA       12   34   25

如何在每個Name索引后添加一個空行?

預期 output:

              IA1  IA2  IA3
Name Subject               
Abc  DS        45   43   34
     DMS       43   23   45
     ADA       32   46   36

Bcd  BA        45   35   37
     EAD       23   45   12
     DS        23   35   43

Cdf  EAD       34   33   23
     ADA       12   34   25
     

使用自定義 function 在GroupBy.apply添加空行:

def f(x):
    x.loc[('', ''), :] = ''
    return x

或者:

def f(x):
    return x.append(pd.DataFrame('', columns=df.columns, index=[(x.name, '')]))

df = df.groupby(level=0, group_keys=False).apply(f)
print (df)
             IA1 IA2 IA3
Name Subject            
Abc  DS       45  43  34
     DMS      43  23  45
     ADA      32  46  36
                        
Bcd  BA       45  35  37
     EAD      23  45  12
     DS       23  35  43
                        
Cdf  EAD      34  33  23
     ADA      12  34  25
                        

在使用pd.MultiIndex.from_productIndex.union然后對其進行排序之后,使用df.reindexfill_value作為''添加另一種方式。

idx = df.index.union(pd.MultiIndex.from_product((df.index.levels[0],[''])),sort=False)
out = df.reindex(sorted(idx,key=lambda x: x[0]),fill_value='')

print(out)

             IA1 IA2 IA3
Name Subject            
Abc  DS       45  43  34
     DMS      43  23  45
     ADA      32  46  36
                        
Bcd  BA       45  35  37
     EAD      23  45  12
     DS       23  35  43
                        
Cdf  EAD      34  33  23
     ADA      12  34  25
 

我們在使用Index.union索引時使用sort=False以便保留順序,然后在第一個元素上使用sorted會返回:

sorted(idx,key=lambda x:x[0])

[('Abc', 'DS'),
 ('Abc', 'DMS'),
 ('Abc', 'ADA'),
 ('Abc', ''),
 ('Bcd', 'BA'),
 ('Bcd', 'EAD'),
 ('Bcd', 'DS'),
 ('Bcd', ''),
 ('Cdf', 'EAD'),
 ('Cdf', 'ADA'),
 ('Cdf', '')]
# reset index 
dfn = df.reset_index()
# find the border idx of 'Name', [2, 5, 7]
idx_list = dfn.drop_duplicates('Name', keep='last').index
# use the border idx, create an empty df, and append to the origin df, then sort the index
df_append = pd.DataFrame('', index = idx_list, columns = dfn.columns)
obj = dfn.append(df_append).sort_index().set_index(['Name', 'Subject'])
print(obj)
             IA1 IA2 IA3
Name Subject            
Abc  DS       45  43  34
     DMS      43  23  45
     ADA      32  46  36
                        
Bcd  BA       45  35  37
     EAD      23  45  12
     DS       23  35  43
                        
Cdf  EAD      34  33  23
     ADA      12  34  25

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM