下面是我的透视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
答案 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)