熊猫在时间序列上向数据框添加列

时间:2020-06-28 14:28:16

标签: python pandas-groupby

我已经完成了数据帧聚合,我想添加一个新列,如果到2020年行中的值> 0,则它将放置1,否则为0。

这是我的代码 和数据帧头

df['year'] = pd.DatetimeIndex(df['TxnDate']).year # add column year
df['client'] = df['Customer'].str.split(' ').str[:3].str.join(' ') # add colum with 3 first word

Datedebut = 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打印在最后一行之前是这样的: enter image description here

最后一行错误是:KeyError:'year'

谢谢

1 个答案:

答案 0 :(得分:0)

当您执行汇总和未堆积(df.groupby(['client','year']).agg({'Amount': ['sum']}).unstack())时,列year的值已扩展为列,这些列是MultiIndex。您可以通过以下方式进行查看:

print (df1.columns)

然后您可以选择它们。

使用MultiIndex列

因此要选择与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(而不是布尔类型),则可以转换为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)