我有一个数据框$(document).ready(function() {
$('input[type=radio]').click(function() {
window.location=$(this).data('href')+"&scat="+$(this).data('scat');
});
// parse the url:
var hrefLink = window.location.search;
// update the correct radio button:
$('input[value=' + hrefLink.substring(hrefLink.indexOf("scat")+5) + ']').prop("checked", true);
// } Commenting an extra closed bracket
});
,如下所示:
df
我想要一个像这样的矩阵结构:
score user product
0 2 2a A
1 3 2a B
2 1 2a C
3 5 2b A
4 0 2b C
5 2 2c B
空格意味着缺失值。我如何获得这种结构?
答案 0 :(得分:4)
我认为您可以pivot
使用set_index
或unstack
:
print (df.pivot(index='user',columns='product', values='score'))
product A B C
user
2a 2.0 3.0 1.0
2b 5.0 NaN 0.0
2c NaN 2.0 NaN
print (df.set_index(['user','product']).score.unstack())
product A B C
user
2a 2.0 3.0 1.0
2b 5.0 NaN 0.0
2c NaN 2.0 NaN
如果需要使用某些值替换NaN
,例如0
添加fillna
或参数fill_value
:
print (df.pivot(index='user',columns='product', values='score').fillna(0).astype(int))
product A B C
user
2a 2 3 1
2b 5 0 0
2c 0 2 0
print (df.set_index(['user','product']).score.unstack(fill_value=0))
product A B C
user
2a 2 3 1
2b 5 0 0
2c 0 2 0
编辑:
如果错误:
ValueError:索引包含重复的条目,无法重塑
这意味着存在重复,需要进行一些聚合。
一个较慢的解决方案是pivot_table
,默认聚合函数是np.mean
,但可以更改为sum
之类的另一个函数:
print (df.pivot_table(index='user',columns='product', values='score', aggfunc=np.mean))
product A B C
user
2a 2.0 3.0 1.0
2b 5.0 NaN 0.0
2c NaN 2.0 NaN
使用groupby
加快解决方案,按照mean
,sum
等功能进行聚合,然后unstack
:
print (df.groupby(['user','product']).score.mean().unstack())
product A B C
user
2a 2.0 3.0 1.0
2b 5.0 NaN 0.0
2c NaN 2.0 NaN