【问题标题】:pandas add column to dataframe aggregate on time series熊猫将列添加到时间序列的数据框聚合中
【发布时间】:2020-06-29 03:38:18
【问题描述】:

我已经完成了数据框聚合,我想添加一个新列,如果行中的 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打印是这样的:

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

谢谢

【问题讨论】:

  • 年份是一行而不是一列?好像是这样,我只是想确认一下
  • 在原始df中,它是一个列
  • 在使用“group by”之前,您是否尝试将新列添加到原始 df?否则,您可以使用“转换”将一列添加回原始 df,请参见此处:stackoverflow.com/questions/37189878/…
  • 将 iloc 与年份索引一起使用。应该工作。

标签: python pandas-groupby


【解决方案1】:

当您执行聚合和未堆叠 (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(而不是 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)

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多