pandas 在子框架中构建包含上个月信息的列

clj7thdc  于 2023-11-15  发布在  其他
关注(0)|答案(2)|浏览(96)

我有这个df的例子
我做了一些转换,我需要得到我的马克值从上个月在一个新的列进行比较。该列应该有最大值的列'马克'根据不同的值在'id'列。
下面是一个例子的框架

df = pd.DataFrame({'date':['202301','202301','202301','202301','202302','202302','202302','202302','202303','202303','202303','202304','202304'], 
            'mark': [1,1,2,3,1,1,1,1,1,3,1,1,1
],
                  'id':[20,20,21,21,20,20,21,21,20,20,21,20,21
]})

字符串
这是我们想要的输出

date    mark    id  mark_previous
202301  1   20  0
202301  1   20  0
202301  2   21  0
202301  3   21  0
202302  1   20  1
202302  1   20  1
202302  1   21  3
202302  1   21  3
202303  1   20  1
202303  3   20  1
202303  1   21  1
202304  1   20  3
202304  1   21  1


你有什么建议,以获得该栏?
最好的问候!

fkvaft9z

fkvaft9z1#

验证码

g = df.groupby(['date', 'id'])
df['mark_previous'] = g.tail(1).groupby('id')['mark'].shift()
df['mark_previous'] = g['mark_previous'].transform('max').fillna(0).astype('int')

字符串
df:

date    mark    id  mark_previous
0   202301  1       20  0
1   202301  1       20  0
2   202301  2       21  0
3   202301  3       21  0
4   202302  1       20  1
5   202302  1       20  1
6   202302  1       21  3
7   202302  1       21  3
8   202303  1       20  1
9   202303  3       20  1
10  202303  1       21  1
11  202304  1       20  3
12  202304  1       21  1

中级

g.tail(1).groupby('id')['mark'].shift()


2izufjch

2izufjch2#

您可以通过以下步骤实现您正在寻找的内容:
将日期转换为日期时间格式,例如

df['date'] = pd.to_datetime(df['date'], format='%Y%m')

字符串
按“id”和“date”对DataFrame进行排序

df = df.sort_values(by=['id', 'date'])


按“id”对DataFrame进行分组,并使用groupby和shift函数

df['mark_shifted'] = df.groupby('id')['mark'].shift(1)


创建和使用累计最大值

df['mark_cummax'] = df.groupby(['id', df['date'].dt.to_period('M')])['mark_shifted'].cummax()


把东西收拾干净

df['mark_previous'] = df['mark_cummax'].fillna(0).astype(int)
df.drop(columns=['mark_shifted', 'mark_cummax'], inplace=True)


给予这个试试!
来源:我的文章https://ioflood.com/blog/pandas-dataframe/

相关问题