【问题标题】:pandas diff() giving 0 value for first difference, I want the actual value insteadpandas diff() 为第一个差异提供 0 值,我想要实际值
【发布时间】:2017-08-02 13:54:54
【问题描述】:

我有 df:

Hour  Energy Wh  
1        4          
2        6           
3        9
4        15

我想添加一个显示每小时差异的列。我正在使用这个:

df['Energy Wh/h'] = df['Energy Wh'].diff().fillna(0)

df1:

Hour  Energy Wh  Energy Wh/h
1        4          0
2        6          2 
3        9          3
4        15         6

但是,Hour 1 值在 Energy Wh/h 列中显示为 0,而我希望它显示为 4,如下所示:

Hour  Energy Wh  Energy Wh/h
1        4          4
2        6          2 
3        9          3
4        15         6

我尝试过使用 np.where:

df['Energy Wh/h']  = np.where(df['Hour'] == 1,df['Energy Wh'].diff().fillna(df['Energy Wh']),df['Energy Wh'].diff().fillna(0))

但我在第 1 小时行 (df1) 中仍然得到 0 值,没有错误。如何获得“能量 Wh”中要填充的第 1 小时的值,而不是 0?

【问题讨论】:

  • 试试这个:df['Energy Wh'].diff().fillna(df['Energy Wh'].iloc[0])

标签: python pandas numpy dataframe


【解决方案1】:

diff() 返回的第一个值始终是NaN,因此只替换这个值而不需要使用fillna(),只使用loc[] 会更快。然后通过astypefloat dtype(由NaN 引入)转换回int(如有必要;即,如果您的系列没有任何其他NaNs 或float 值):

df['Energy W/h'] = df['Energy Wh'].diff()
df.loc[0, 'Energy W/h'] = df['Energy Wh'].iloc[0]
df['Energy W/h'] = df['Energy W/h'].astype(int)
print (df)
   Hour  Energy Wh  Energy W/h
0     1          4           4
1     2          6           2
2     3          9           3
3     4         15           6

更一般的做法是:

df.index = [5,6,7,8]
print (df)
   Hour  Energy Wh
5     1          4
6     2          6
7     3          9
8     4         15

df['Energy W/h'] = df['Energy Wh'].diff()
df.loc[df.index[0], 'Energy W/h'] = df['Energy Wh'].iloc[0]
df['Energy W/h'] = df['Energy W/h'].astype(int)

print (df)
   Hour  Energy Wh  Energy W/h
5     1          4           4
6     2          6           2
7     3          9           3
8     4         15           6

【讨论】:

  • 谢谢,我现在就试试这个。我能问一下为什么将浮点值转换为 int 很重要吗?
  • 不,没有必要——这取决于你。但如果原始值为 int,则只有一个 NaN 强制转换列浮动。因此,如果需要int,请将其从float 转换回int
  • 对于 pandas diff() 来说,用相应的未修改值覆盖 NaN diff'd 值将是一个有用的增强或修改;然后强制回到原来的 dtype。这里有常见的情况periods=1,所以我们正在处理第一个值.iloc[0],但对于滞后(?)差异,它也可能是-1。似乎我们中的许多人都非常需要这个。
【解决方案2】:

您可以只使用原始列fillna(),而不使用np.where

>>> df['Energy Wh/h'] = df['Energy Wh'].diff().fillna(df['Energy Wh'])
>>> df
      Energy Wh  Energy Wh/h
Hour
   1          4          4.0
   2          6          2.0
   3          9          3.0
   4         15          6.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2017-12-11
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多