python3:pandas按几列分组,并将行值转换为多列
我有如下数据框:python3:pandas按几列分组,并将行值转换为多列,pandas,dataframe,python-3.6,Pandas,Dataframe,Python 3.6,我有如下数据框: id date t_s t_p t_prob 1 '2020-01-01' 1 1 0.5 1 '2020-01-01' 2 1 0.55 1 '2020-01-01' 3 1 0.56 1 '2020-01-01' 4 0 0.4 1 '2020-01-01' 5 1 0.6 1
id date t_s t_p t_prob
1 '2020-01-01' 1 1 0.5
1 '2020-01-01' 2 1 0.55
1 '2020-01-01' 3 1 0.56
1 '2020-01-01' 4 0 0.4
1 '2020-01-01' 5 1 0.6
1 '2020-01-01' 6 1 0.7
2 '2020-01-01' 1 1 0.77
2 '2020-01-01' 2 0 0.3
2 '2020-01-01' 3 0 0.2
2 '2020-01-01' 4 0 0.33
2 '2020-01-01' 5 1 0.66
2 '2020-01-01' 6 1 0.56
....
例如,每个id都有相同的日期(2020-01-01-2020-01-09)。每个id对于每个日期有6个t_(1,2,3,4,5,6),t_p是每个t_的标签,t_prob是每个t_的标签值。我想将同一日期内每个t_的t_prob值转换为t_s_1、t_s_2、t_s_3、t_s_4、t_s_5、t_s_6等列。最后得到t_prob的最大值和t_s值。与'2020-01-01'中的id 1一样,t_s_6是最大值
id date t_s_1 t_s_2 t_s_3 t_s_4 t_s_5 t_s_6 t_prob_max_s
1 '2020-01-01' 0.5 0.55 0.56 0.4 0.6 0.7 6
2 '2020-01-01' 0.77 0.3 0.2 0.33 0.66 0.56 1
....
谢谢 由相关索引列和要取消堆栈的列组成的第一组。根据上下文,您可以选择“最大”聚合以外的内容。如果每一次都发生一次,那就没关系了
unstacked = df.groupby(['id', 'date', 't_s'])['t_prob'].aggregate('max').unstack()
或者:
df.pivot_table(index=['id', 'date'], columns='t_s', values='t_prob', aggfunc='max')
这不太灵活,但在上下文中可能更清晰
重命名轴,使轴上的列没有奇怪的“t_s”名称。然后重命名列,使其枚举t_:
unstacked_renamed = unstacked.rename_axis(columns = None).rename(columns={val:f't_s_{val}' for val in unstacked.columns.values})
获取每行具有最高值的列的索引,然后对其进行预处理,以获取与该列相关的t_数:
unstacked_renamed['t_prob_max_s'] = unstacked_renamed.idxmax(axis=1).str.split('_').str[-1]
重置索引,使其再次平坦:
unstacked_reindexed = unstacked_renamed.reset_index()
检查正确性:
>>unstacked_reindexed
id date t_s_1 t_s_2 t_s_3 t_s_4 t_s_5 t_s_6 t_prob_max_s
0 1 '2020-01-01' 0.50 0.55 0.56 0.40 0.60 0.70 6
1 2 '2020-01-01' 0.77 0.30 0.20 0.33 0.66 0.56 1
即使初始数据未被索引器排序,如果给定的t_s值多次出现(但选择的聚合是不可忽略的),或者存在缺失/跳过的t_s(例如,t_s 1,2,3,4,5,7的值),这种方法仍然有效。一般来说,这是一个非常健壮的解决方案。可能是
groupby
,我以前做过,但我现在做不到。每个唯一id的每个日期的t\s
值是否按顺序存在,即从1
到6
?似乎取消堆栈
也可以这样做。也许取消堆栈
可以一次性完成所有操作?在这种情况下,“所有”是什么意思?它只是将一个标高从一个轴旋转到另一个轴。也许pd.pivot_table()可能更有效,我会调查。是的,你是对的。那不重要。谢谢你的回答。我的代码中有一个错误,TypeError:rename_axis()得到了一个意外的关键字参数'columns',这令人惊讶,因为'pd.DataFrame().rename_axis()'接受了关键字参数'columns'。我建议检查未标记的数据帧是否与预期的一样。如果初始数据帧与原始文章中提供的数据帧明显不同,那么代码的行为可能会有所不同。