为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫将列添加到时间序列上的数据框聚合

熊猫将列添加到时间序列上的数据框聚合

心有法竹 2023-02-07 15:57:07
我做了一个数据框聚合,我想添加一个新列,如果行中 2020 年的值 > 0,它将放置 1,否则放置 0。这是我的代码和数据框的负责人df['year'] = pd.DatetimeIndex(df['TxnDate']).year # add column yeardf['client'] = df['Customer'].str.split(' ').str[:3].str.join(' ') # add colum with 3 first wordDatedebut = df['year'].min()Datefin = df['year'].max()#print(df)df1 = df.groupby(['client','year']).agg({'Amount': ['sum']}).unstack()print(df1)df1['nb2020']= np.where( df1['year']==2020, 1, 0)最后一行之前的数据框 df1 打印是这样的:最后一行错误是:KeyError: 'year'
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

当你进行聚合和unstacked( df.groupby(['client','year']).agg({'Amount': ['sum']}).unstack())时,列的值year已经展开成列,这些列就是一个MultiIndex。您可以通过以下方式查看:

print (df1.columns)

然后你可以选择它们。

使用多索引列

因此,要选择与 2020 匹配的列,您可以使用:

df1.loc[:,df1.columns.get_level_values(2).isin({2020})

您可能可以获得正确的列,然后使用以下方法检查 2020 是否具有非零值:

df1['nb2020'] = df1.loc[:,df1.columns.get_level_values('year').isin({2020})] > 0

如果您想要 1 和 0(而不是 bool 类型),您可以转换为 int(使用astype)。

重命名列

如果您认为这有点复杂,您可能还希望将列更改为单个索引。使用类似的东西

df1.columns = df1.columns.get_level_values('year')

或者

df1.columns = df1.columns.get_level_values(2)

进而

df1['nb2020'] = (df1[2020] > 0).astype(int)


查看完整回答
反对 回复 2023-02-07
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号