【问题标题】:What is happening when pandas.Series converts int64s into NaNs?当 pandas.Series 将 int64 转换为 NaN 时会发生什么?
【发布时间】:2019-11-11 01:55:47
【问题描述】:

我有一个包含日期和整数(标题:日期、数字)的 csv,由制表符分隔。

我正在尝试使用CalMap(该页面上的演示)创建日历热图。创建图表的函数采用 DateTime 索引的数据。

df = pd.read_csv("data.csv",delimiter="\t")
df['Date'] = df['Date'].astype('datetime64[ns]')

events = pd.Series(df['Date'],index = df['Number'])
calmap.yearplot(events)

但是当我检查events.head(5) 时,它给出的日期是 NaN。我检查了df['Number'].head(5),它们显示为 int64。

我做错了什么导致了这种转换?

编辑:下面的数据

Date    Number
7/9/2018    40
7/10/2018   40
7/11/2018   40
7/12/2018   70
7/13/2018   30

编辑:events.head(5) 的输出

2018-07-09   NaN
2018-07-10   NaN
2018-07-11   NaN
2018-07-12   NaN
2018-07-13   NaN
dtype: float64

【问题讨论】:

  • 对于minimal reproducible example,发布data.csv 的前五行(如果标题为六行)会有所帮助。
  • 谢谢@Amadan,我还在学习 Stack Overflow 的礼仪。

标签: python pandas nan series


【解决方案1】:

首先,它不是NaN,而是NaT(不是时间戳),这是 Pandas 独有的,虽然 Pandas 使其与 NaN 兼容,并且在浮点列中使用它类似于 NaN标记缺失的数据。

pd.Series(data, index=index) 的作用显然取决于data 的类型。如果data 是一个列表,那么index 的长度必须相等,并且将构造一个新的Series,其中data 是数据,index 是索引。但是,如果data 已经是Series(例如df['Date']),它将取而代之的是与index 对应的行,并从这些行中构造一个新的Series。例如:

pd.Series(df['Date'], [1, 1, 4])

会给你

1   2018-07-10
1   2018-07-10
4   2018-07-13

2018-07-10 来自第 1 行,2018-07-11 来自df['Date'] 的第 4 行。但是,您的示例输入数据中没有索引为407030 的行,因此假定缺少数据,而是插入NaT

相比之下,当您改用列表时,您会得到以下结果:

pd.Series(df['Date'].to_list(), index=df['Number'])
# => Number
#    40   2018-07-09
#    40   2018-07-10
#    40   2018-07-11
#    70   2018-07-12
#    30   2018-07-13
#    dtype: datetime64[ns]

【讨论】:

  • 感谢您的回复,但在我的输出中,它特别指出了 NaN。也许另一个问题正在出现?我会将输出作为原始问题的编辑。
  • @Toblor:嗯,很奇怪。可能是版本不同吧。
  • 我相信我已经弄明白了。您将我引导到将系列操作为列表的正确方向,因此我将df['Date']df['Number'] 都转换为列表,这适用于我的代码。再次感谢您!
【解决方案2】:

我可以通过df['Date'].tolist()df['Number'].tolist() 将系列更改为列表来解决此问题。 calmap.calendarplot(events) 能够接受这些而不是原始参数作为系列。

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2012-09-10
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多