熊猫:通过删除多索引数据框中的NaN将多行折叠为单行

时间:2020-10-21 11:16:37

标签: python python-3.x pandas dataframe

下面是我的透视df:

Out[1446]: 
            D                            
A         abc                            
C          G2     G3     G4     G1     G5
B uniq                                   
x 1     100.0    NaN    NaN    NaN    NaN
  2       NaN  200.0    NaN    NaN    NaN
  3       NaN    NaN  300.0    NaN    NaN
y 4       NaN    NaN    NaN  200.0    NaN
  5       NaN    NaN    NaN    NaN  100.0

现在,我要折叠此数据框。逻辑是:在B上分组,忽略uniq,我想在数据框中添加一行。

预期输出:

Out[1446]: 
            D                            
A         abc                            
C          G2     G3     G4     G1     G5
B                                    
x       100.0  200.0  300.0    NaN    NaN
y         NaN    NaN    NaN  200.0  100.0

如何实现?

编辑:

In [1472]: df = pd.DataFrame({'A':['abc', 'abc', 'abc', 'abc', 'abc'], 'B':['ab', 'bc', 'cd', 'de', 'ef'], 'C':['G1','G1','G2', 'G3', 'G2'], 'D':[1,2,3,4,5]})

In [1473]: df
Out[1473]: 
     A   B   C  D
0  abc  ab  G1  1
1  abc  bc  G1  2
2  abc  cd  G2  3
3  abc  de  G3  4
4  abc  ef  G2  5

In [1474]: df.pivot(index=None, columns=['A', 'B', 'C'])
Out[1474]: 
     D                    
A  abc                    
B   ab   bc   cd   de   ef
C   G1   G1   G2   G3   G2
0  1.0  NaN  NaN  NaN  NaN
1  NaN  2.0  NaN  NaN  NaN
2  NaN  NaN  3.0  NaN  NaN
3  NaN  NaN  NaN  4.0  NaN
4  NaN  NaN  NaN  NaN  5.0

预期输出:

Out[1474]: 
     D                    
A  abc                    
B   ab   bc   cd   de   ef
C   G1   G1   G2   G3   G2
0  1.0  2.0  3.0  4.0  5.0

1 个答案:

答案 0 :(得分:1)

如果每个组始终有一个不丢失的值,请使用GroupBy.first返回第一个MultiIndex级别的第一个非NaN值:

df = df.groupby(level=0).first()
print (df)
       D                            
     abc                            
      G2     G3     G4     G1     G5
x  100.0  200.0  300.0    NaN    NaN
y    NaN    NaN    NaN  200.0  100.0

如果存在多个非缺失值,则仅首先返回,而所有缺失值将返回一行:

print (df)
         D                      
       abc                      
        G2     G3     G4  G1  G5
x 1  100.0    NaN    NaN NaN NaN
  2    8.0  200.0    NaN NaN NaN <- multiple values
  3    NaN    NaN  300.0 NaN NaN
y 4    NaN    NaN    NaN NaN NaN  <- all missing values
  5    NaN    NaN    NaN NaN NaN  <- all missing values

df = df.groupby(level=0).first()
print (df)
       D                      
     abc                      
      G2     G3     G4  G1  G5
x  100.0  200.0  300.0 NaN NaN
y    NaN    NaN    NaN NaN NaN

编辑:

如果没有MultiIndex,则需要其他解决方案:

df = df.pivot(index=None, columns=['A', 'B', 'C'])

#no MultiIndex
print (df.index)
Int64Index([0, 1, 2, 3, 4], dtype='int64')



if df.index.nlevels == 1:

    df1 = df.apply(lambda x: pd.Series(x.dropna().to_numpy())).iloc[[0]]
    print (df1)
             D                    
    A  abc                    
    B   ab   bc   cd   de   ef
    C   G1   G1   G2   G3   G2
    0  1.0  2.0  3.0  4.0  5.0

else:
    df1 = df.groupby(level=0).first()
    print (df1)
相关问题