调用groupby和从pandas转换时如何保留列顺序?

卡斯滕

似乎在调用时按列索引对列进行了重新排序pandas.DataFrame.groupby().shift()sort参数仅适用于行。

这是一个例子:

import pandas as pd
df = pd.DataFrame({'A': ['group1', 'group1', 'group2', 'group2', 'group3', 'group3'],
                   'E': ['a','b','c','d','e','f'],
                   'B': [10, 12, 10, 25, 10, 12],
                   'C': [100, 102, 100, 250, 100, 102],
                   'D': [1,2,3,4,5,6]
                  })

df.set_index('A',inplace=True)
df = df[['E','C','D','B']]
df

#         E     C   D    B
#     A            
#group1   a   100   1   10
#group1   b   102   2   12
#group2   c   100   3   10
#group2   d   250   4   25
#group3   e   100   5   10
#group3   f   102   6   12

从这里开始,我想实现:

#         E     C   D    B    C_s     D_s   B_s
#     A                     
#group1   a   100   1   10   102.0    2.0  12.0     
#group1   b   102   2   12     NaN    NaN   NaN     
#group2   c   100   3   10   250.0    4.0  25.0     
#group2   d   250   4   25     NaN    NaN   NaN     
#group3   e   100   5   10   102.0    6.0  12.0     
#group3   f   102   6   12     NaN    NaN   NaN

df[['C_s','D_s','B_s']]= df.groupby(level='A')[['C','D','B']].shift(-1)

结果是:

#         E     C   D    B    C_s     D_s   B_s
#     A                     
#group1   a   100   1   10   12.0   102.0   2.0
#group1   b   102   2   12    NaN     NaN   NaN
#group2   c   100   3   10   25.0   250.0   4.0
#group2   d   250   4   25    NaN     NaN   NaN
#group3   e   100   5   10   12.0   102.0   6.0
#group3   f   102   6   12    NaN     NaN   NaN

引入列的人工排序有助于维护列的固有逻辑连接:

df = df.sort_index(axis=1)
df[['B_s','C_s','D_s']]= df.groupby(level='A')[['B','C','D']].shift(-1).sort_index(axis=1)
df
#         B    C  D  E   B_s   C_s   D_s
#     A              
#group1  10  100  1  a  12.0  102.0  2.0
#group1  12  102  2  b   NaN   NaN   NaN
#group2  10  100  3  c  25.0  250.0  4.0
#group2  25  250  4  d   NaN   NaN   NaN
#group3  10  100  5  e  12.0  102.0  6.0
#group3  12  102  6  f   NaN   NaN   NaN 

为什么列首先要重新排序?

耶斯列尔

我认为这是错误。

工作自定义lambda函数:

df[['C_s','D_s','B_s']] = df.groupby(level='A')['C','D','B'].apply(lambda x: x.shift(-1))
print (df)
        E    C  D   B    C_s  D_s   B_s
A                                      
group1  a  100  1  10  102.0  2.0  12.0
group1  b  102  2  12    NaN  NaN   NaN
group2  c  100  3  10  250.0  4.0  25.0
group2  d  250  4  25    NaN  NaN   NaN
group3  e  100  5  10  102.0  6.0  12.0
group3  f  102  6  12    NaN  NaN   NaN

谢谢@cᴏʟᴅsᴘᴇᴇᴅ提供的另一种解决方案:

df[['C_s','D_s','B_s']] = (df.groupby(level='A')['C','D','B']
                             .apply(pd.DataFrame.shift, periods=-1))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python Pandas:使用groupby()和agg()时是否保留顺序?

Dgrid:如何保存和保留列顺序?

保留列顺序-Python Pandas和列Concat

合并DataFrame时保留索引和列顺序

Pandas groupby:在创建具有两列的 groupby 时如何以正确的顺序对工作日进行排序?

如何将2D数据帧转换为3D矩阵,并保留行和列顺序

如何使用groupby在pandas中以相反的顺序对列求和

转换视频时如何添加和/或保留字幕?

Pandas - groupby 多列并保留多列-

在附加时保留数据框列顺序

在Python Pandas DataFrame中保留列顺序

将JSON加载到Pandas数据框时保留列顺序

当Pandas Dataframe.Combine或DataFrame.Combine_First时,可以保留列顺序吗?

在 Pandas Groupby 和 Agg 中保留一列但使用其他列

不能由GroupBy和Aggregation保留Spark SQL排序顺序?

当groupby和agg在同一列上时,列顺序更改

执行pandas.DataFrame.groupby()。sum()时保留非数字列

保留http调用的顺序

使用groupby和mean()在Pandas中保留带有分类变量的列

当使用`.loc`访问多索引数据框时,如何保留列的顺序?

在按列划分为CSV格式的DataFrame时,如何保留DataFrame的顺序?

如何使用Pandas groupby和Aggregate生成新列?

Pandas:如何在關於索引的 groupby.agg() 操作之後保留分類列?

如何使用Pandas groupby在组上添加顺序计数器列

如何使用 Pandas groupby 在组上添加顺序计数器列?

GroupBy 索引和列然后转换 Pandas 中的选定列

如何将列表转换为小标题,保留顺序

Pandas:在日期时间执行 Groupby 滚动时不保留索引

在使用ffmpeg转换视频时,如何保留音频和字幕流的描述性名称?