熊猫:根据新值编辑索引值并重新分组

时间:2020-01-09 09:47:07

标签: python pandas

我将索引设置为“ ShiftId”,如下所示:201912240(日期后跟0或1,表示白天或黑夜)。我将df按索引值分组,这些索引值按预期返回如下内容:

           col1 col2
201912240  NaN  23
201912241  44   75
201912250  12   NaN
201912251  46   91

我想重新组合此数据框以获取每天的平均值(忽略NaN值),那么它将看起来像这样

           col1 col2
20191224   44   49
20191225   29   91 

但是我无法将当前索引值进行分组。我尝试过

    days_frame.index = days_frame.index.map(lambda x: str(x)[:-1])
    days_frame.groupby(days_frame.index).mean()

但这甚至不会改变df中的任何内容吗?

请帮助

1 个答案:

答案 0 :(得分:0)

您为我工作的解决方案,也许您忘记了在此处将输出分配给df之类的变量:

days_frame.index = days_frame.index.map(lambda x: str(x)[:-1])
df = days_frame.groupby(days_frame.index).mean()
print (df)
          col1  col2
20191224  44.0  49.0
20191225  29.0  91.0

另一种解决方案是先重命名索引,然后对每个索引值使用mean

df = days_frame.rename(lambda x: str(x)[:-1]).mean(level=0)
print (df)
          col1  col2
20191224  44.0  49.0
20191225  29.0  91.0

或将索引转换为字符串,删除最后一个值,然后以汇总groupby传递到mean

df = days_frame.groupby(days_frame.index.astype(str).str[:-1]).mean()
print (df)
          col1  col2
20191224  44.0  49.0
20191225  29.0  91.0

编辑:

如果要避免截断没有A列的所有列,请在写入文件之前使用此解决方案:

df = pd.DataFrame({'A':[.41,1.5,.2,2,.3],
                   'B':['a'] * 5,
                   'C':[3,4,5,4,5],
                   'D':[1.0,3,4,5,6]})

cols = df.columns.difference(['A'])

df[cols] = df[cols].applymap(lambda x: '%.0f' % x if isinstance(x, (float, int)) else x)
print (df)

      A  B  C  D
0  0.41  a  3  1
1  1.50  a  4  3
2  0.20  a  5  4
3  2.00  a  4  5
4  0.30  a  5  6