熊猫:获取最后一个、倒数第二个、倒数第二个月份的值



我无法在给定参考日期的情况下获取python中变量的最后一个,倒数第二个和倒数第二个月值。我 我有两个数据帧:

<th style="text-align: left;">reference_dateid_clienteA8781B7638A8781
201504
201706
201401

首先按id_clientedf1['reference_date']过滤df2['date']后的行,按Series.map比较按Series.gt大,并在boolean indexing中过滤,然后按DataFrame.sort_values排序以获得正确的顺序:

s = df1.set_index('id_cliente')['reference_date']
df = (df2[df2['id_client'].map(s).gt(df2['date'])]
.sort_values(['id_client','date'], ascending=[True, False]))

然后按计数器GroupBy.cumcount为过滤器 3 行创建帮助器列,也用于按DataFrame.pivot进行透视:

df['g'] = df.groupby('id_client').cumcount()
df = df[df['g'].lt(3)].copy()
df = df.pivot('id_client','g','sales')

最后设置新列名,通过映射添加reference_date并将索引转换为列:

df.columns = ['last_date','penultimate_date','antepenultimate_date']
df = df.reset_index()
df.insert(0,'reference_date', df['id_client'].map(s))
print (df)
reference_date id_client  last_date  penultimate_date  antepenultimate_date
0          201504     A8781       3200              6500                  3400
1          201706     B7638        100               200                   300

编辑:多个id_cliente的类似答案 - 而不是mapDataFrame.merge使用,并且用于区分重复的id_clienteGroupBy.cumcount

df1['groups'] = df1.groupby('id_cliente').cumcount()
df = df2.merge(df1, left_on='id_client', right_on='id_cliente')
df = (df[df['reference_date'].gt(df['date'])]
.sort_values(['groups','id_client','date'], ascending=[True, True, False])
)
df['g'] = df.groupby(['id_client','groups']).cumcount()
df = df[df['g'].lt(3)].copy()
df = df.pivot(['groups','id_client'],'g','sales')
print (df)
df.columns = ['last_date','penultimate_date','antepenultimate_date']
df = df1.join(df, on=['groups','id_cliente']).drop('groups', axis=1)
print (df)
reference_date id_cliente  last_date  penultimate_date  
0          201504      A8781       3200              6500   
1          201706      B7638        100               200   
2          201401      A8781          3                 2   
antepenultimate_date  
0                  3400  
1                   300  
2                     1  

假设示例中数据帧的结构 - 聚合date列上的第二个数据帧,然后选择第 n 个条目。您可以将.groupby.nth().pivot()一起使用,以执行此任务。

n_obs = 3 # number of observations per item
grouped = df2[['id_client', 'sales']].groupby('id_client').nth(list(range(n_obs))
# Reformat the table to desired shape for last 3 values, change 
grouped.assign(row_num=grouped.index%n_obs).pivot(
index='id_client', columns='row_num', values='sales').rename_axis(
'', axis=1).reset_index().rename(
columns={0:'last', 1:'penulltimate', 2:'antepenultimate'})

输出:

id_client   last    penulltimate    antepenultimate
0   A8781       3200    6500            3400
1   B7638       300     200             100

现在,您可以将其合并到id_client字段上的原始数据帧中。

参考: 分组按第 n 个

相关内容

  • 没有找到相关文章

最新更新