Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python3:pandas按几列分组,并将行值转换为多列_Pandas_Dataframe_Python 3.6 - Fatal编程技术网

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'。我建议检查未标记的数据帧是否与预期的一样。如果初始数据帧与原始文章中提供的数据帧明显不同,那么代码的行为可能会有所不同。