【问题标题】:Is there a way to cast to an Int from a diff on a dataframe?有没有办法从数据帧上的差异转换为 Int?
【发布时间】:2021-05-11 07:42:30
【问题描述】:

我有一个函数fn_weekly,如果星期发生变化(星期一),它会产生我想要的1df 是任何带有索引时间戳的数据帧。

我正在尝试创建一个输出相同格式的 fn_monthly,但我得到的是 floats 而不是 ints

我做错了什么?

另外,如果有更简洁的方法来实现fn_monthly,请告诉我。谢谢!

import pandas as pd

fn_weekly = lambda df: pd.DataFrame(df.index.isocalendar().week).diff()

fn_monthly = lambda df: pd.DataFrame(pd.Series(df.index.month, index=df.index)).diff()

>>> fn_weekly(df)
            week
Date
2019-02-04  <NA>
2019-02-05     0
2019-02-06     0
2019-02-07     0
2019-02-08     0
...          ...
2021-02-01     1
2021-02-02     0
2021-02-03     0
2021-02-04     0
2021-02-05     0

>>> fn_monthly(df)
            Date
Date
2019-02-04   NaN
2019-02-05   0.0
2019-02-06   0.0
2019-02-07   0.0
2019-02-08   0.0
...          ...
2021-02-01   1.0
2021-02-02   0.0
2021-02-03   0.0
2021-02-04   0.0
2021-02-05   0.0

【问题讨论】:

    标签: python pandas dataframe time-series timestamp


    【解决方案1】:

    为了方便您将值更改为 int:

    df['a'] = df['a'].astype(int)
    

    另外,为避免 NaN 值出现问题,您可以尝试使用 fillna 函数

    df['a'] = df['a'].fillna(0).astype(int)
    

    现在关于值类型的差异,在查看pandas系列(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.diff.html)的diff函数的文档时,它在注释部分说如下:

    Notes
    
    For boolean dtypes, this uses operator.xor() rather than operator.sub(). 
    The result is calculated according to current dtype in Series, however dtype 
    of the result is always float64.
    

    series.diff 的结果总是浮点数,这就是为什么值的类型有所不同

    【讨论】:

    • 感谢您的建议。但是,这种技术似乎不喜欢在第一行中包含“NaN”(与“”相反)的第一行。我收到“ValueError:无法将非有限值(NA 或 inf)转换为整数”。
    • 另外,奇怪的是,当我检查使用 fn_weekly lambda 的元素类型时,我得到 '' (与您的文档参考相反) - 让我去嗯。 ..
    • fn_monthly 与 fn_weekly 不同,因为在您的代码中您将其转换为 pd.Series(df.index.month, index=df.index)) 中的系列,这就是您获得不同数据类型的原因
    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多