考虑以下pd.DataFrame
temp = pd.DataFrame({'label_0':[1,1,1,2,2,2],'label_1':['a','b','c',np.nan,'c','b'], 'values':[0,2,4,np.nan,8,5]})
print(temp)
label_0 label_1 values
0 1 a 0.0
1 1 b 2.0
2 1 c 4.0
3 2 NaN NaN
4 2 c 8.0
5 2 b 5.0
我想要的输出是
label_1 1 2
0 a 0.0 NaN
1 b 2.0 5.0
2 c 4.0 8.0
3 NaN NaN NaN
我尝试过pd.pivot
并与pd.gropuby
纠缠不清,但由于条目重复而无法获得所需的输出。任何最感激的帮助。
答案 0 :(得分:3)
另一种方法是使用set_index并取消堆栈:
temp.set_index(['label_0','label_1'])['values'].unstack(0)
输出:
label_0 1 2
label_1
NaN NaN NaN
a 0.0 NaN
b 2.0 5.0
c 4.0 8.0
答案 1 :(得分:3)
d = {}
for _0, _1, v in zip(*map(temp.get, temp)):
d.setdefault(_1, {})[_0] = v
pd.DataFrame.from_dict(d, orient='index')
1 2
a 0.0 NaN
b 2.0 5.0
c 4.0 8.0
NaN NaN NaN
OR
pd.DataFrame.from_dict(d, orient='index').rename_axis('label_1').reset_index()
label_1 1 2
0 a 0.0 NaN
1 b 2.0 5.0
2 c 4.0 8.0
3 NaN NaN NaN
答案 2 :(得分:2)
您可以先进行fillna
然后进行pivot
temp.fillna('NaN').pivot(*temp.columns).T
Out[251]:
label_0 1 2
label_1
NaN NaN NaN
a 0 NaN
b 2 5
c 4 8
答案 3 :(得分:0)
看起来像一个简单的dataframe['maxXY'] = dataframe.iloc[:, target_columns].max(1)
可以工作:
pivot
输出:
temp.pivot(columns='label_0', index='label_1', values='values')