Pandas 中日期列的最大值/最小值,列包含 nan 值
Posted
技术标签:
【中文标题】Pandas 中日期列的最大值/最小值,列包含 nan 值【英文标题】:Max / Min of date column in Pandas, columns include nan values 【发布时间】:2017-11-02 10:02:25 【问题描述】:我正在尝试在 pandas 数据框中创建一个新列,其中包含来自其他两个日期列的最大(或最小)日期。但是,当这些列中的任何一个存在 NAN 时,整个 min/max 列都会变成 NAN。是什么赋予了?使用数字列时,这很好用……但是对于日期,新列都是 NAN。下面是一些示例代码来说明问题:
df = pd.DataFrame(data=[[np.nan,date(2000,11,1)],
[date(2000,12,1), date(2000,9,1)],
[date(2000,4,1),np.nan],
[date(2000,12,2),np.nan]], columns=['col1','col2'])
df['col3'] = df[['col1','col2']].max(axis=1)
我知道它可以通过 loc 和 、isnull 等的组合来完成。但是如何让它与常规的 max/min 函数一起工作呢?
【问题讨论】:
【参考方案1】:您将date
对象存储在列中,如果您转换为datetime
,那么它会按预期工作:
In[10]:
df['col1'] = pd.to_datetime(df['col1'])
df['col2'] = pd.to_datetime(df['col2'])
df
Out[10]:
col1 col2 col3
0 NaT 2000-11-01 NaN
1 2000-12-01 2000-09-01 NaN
2 2000-04-01 NaT NaN
3 2000-12-02 NaT NaN
In[11]:
df['col3'] = df[['col1','col2']].max(axis=1)
df
Out[11]:
col1 col2 col3
0 NaT 2000-11-01 2000-11-01
1 2000-12-01 2000-09-01 2000-12-01
2 2000-04-01 NaT 2000-04-01
3 2000-12-02 NaT 2000-12-02
如果你只是这样做:
df['col3'] = df['col1'].max()
这会引发TypeError: '>=' not supported between instances of 'float' and 'datetime.date'
NaN
值导致dtype
提升为float
,因此NaN
被返回。如果您没有缺失值,那么它将按预期工作,如果您有缺失值,那么您应该将dtype
转换为datetime
,以便将缺失值转换为NaT
,以便max
正常工作
【讨论】:
谢谢 - 它确实适用于日期时间。不过,如果它也能处理日期就好了 ;-) 就像我说的,如果你没有NaN
值,它会正常工作,即使它们是 NaT
它仍然会失败
我的意思是如果它用 NaN 处理日期会很好:)
这更多地与不兼容的类型有关,如果你有字符串和数字的混合,那么它会以同样的方式失败
多么棒的答案。我一直在使用令人困惑的 datetime.strptime
,但 pandas 有一个优雅的内部选项,可以计算最大值。谢谢!以上是关于Pandas 中日期列的最大值/最小值,列包含 nan 值的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas、Python 中查找具有相同第一列的所有行的最小值、最大值、平均值
Pandas Dataframe groupby 聚合函数和动态列的最大值和最小值之间的差异
如何在不创建临时列的情况下从 pandas 数据框列计算最小值?