Python 取非缺失日期的最大值
我有一个带有nan和date值的Pandas数据框(float和datetime的组合): 我想取每行的最长日期。但是,如果我取Python 取非缺失日期的最大值,python,date,pandas,types,null,Python,Date,Pandas,Types,Null,我有一个带有nan和date值的Pandas数据框(float和datetime的组合): 我想取每行的最长日期。但是,如果我取df.max(axis=1) Out[77]: 0 NaN 1 NaN 2 NaN dtype: float64 如何返回每行中的最大非空日期 您需要先转换两列,因为混合值-dates和nan。然后将nan转换为NaT df.A = pd.to_datetime(df.A) df.B = pd.to_datetime(df.B) print (df)
df.max(axis=1)
Out[77]:
0 NaN
1 NaN
2 NaN
dtype: float64
如何返回每行中的最大非空日期 您需要先转换两列,因为混合值-
dates
和nan
。然后将nan
转换为NaT
df.A = pd.to_datetime(df.A)
df.B = pd.to_datetime(df.B)
print (df)
A B
0 NaT 2016-01-01
1 2016-01-02 NaT
2 NaT 2016-01-03
print (df.max())
A 2016-01-02
B 2016-01-03
dtype: datetime64[ns]
print (df.max(axis=1))
0 2016-01-01
1 2016-01-02
2 2016-01-03
dtype: datetime64[ns]
具有和列表理解功能的更具动态性的解决方案
:
df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
print (df)
A B
0 NaT 2016-01-01
1 2016-01-02 NaT
2 NaT 2016-01-03
或使用应用:
df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
计时:
In [28]: %timeit (c(df2))
100 loops, best of 3: 4.55 ms per loop
In [29]: %timeit (b(df1))
100 loops, best of 3: 12.8 ms per loop
In [30]: %timeit (a(df))
100 loops, best of 3: 12.8 ms per loop
df = pd.DataFrame({"A": [np.nan,
datetime.date(2016, 1, 2),
np.nan],
"B": [datetime.date(2016, 1, 1),
np.nan,
datetime.date(2016, 1, 3)],
"C": [datetime.date(2016, 1, 1),
np.nan,
datetime.date(2016, 1, 3)]
})
print (df)
#[300000 rows x 3 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
df1 = df.copy()
df2 = df.copy()
def a(df):
df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
return df
def b(df):
df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
return df
def c(df):
df.A = pd.to_datetime(df.A)
df.B = pd.to_datetime(df.B)
df.C = pd.to_datetime(df.C)
return df
计时代码:
In [28]: %timeit (c(df2))
100 loops, best of 3: 4.55 ms per loop
In [29]: %timeit (b(df1))
100 loops, best of 3: 12.8 ms per loop
In [30]: %timeit (a(df))
100 loops, best of 3: 12.8 ms per loop
df = pd.DataFrame({"A": [np.nan,
datetime.date(2016, 1, 2),
np.nan],
"B": [datetime.date(2016, 1, 1),
np.nan,
datetime.date(2016, 1, 3)],
"C": [datetime.date(2016, 1, 1),
np.nan,
datetime.date(2016, 1, 3)]
})
print (df)
#[300000 rows x 3 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
df1 = df.copy()
df2 = df.copy()
def a(df):
df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
return df
def b(df):
df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
return df
def c(df):
df.A = pd.to_datetime(df.A)
df.B = pd.to_datetime(df.B)
df.C = pd.to_datetime(df.C)
return df
您需要首先转换这两个列,因为混合了值-日期
和nan
。然后将nan
转换为NaT
df.A = pd.to_datetime(df.A)
df.B = pd.to_datetime(df.B)
print (df)
A B
0 NaT 2016-01-01
1 2016-01-02 NaT
2 NaT 2016-01-03
print (df.max())
A 2016-01-02
B 2016-01-03
dtype: datetime64[ns]
print (df.max(axis=1))
0 2016-01-01
1 2016-01-02
2 2016-01-03
dtype: datetime64[ns]
具有和列表理解功能的更具动态性的解决方案
:
df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
print (df)
A B
0 NaT 2016-01-01
1 2016-01-02 NaT
2 NaT 2016-01-03
或使用应用:
df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
计时:
In [28]: %timeit (c(df2))
100 loops, best of 3: 4.55 ms per loop
In [29]: %timeit (b(df1))
100 loops, best of 3: 12.8 ms per loop
In [30]: %timeit (a(df))
100 loops, best of 3: 12.8 ms per loop
df = pd.DataFrame({"A": [np.nan,
datetime.date(2016, 1, 2),
np.nan],
"B": [datetime.date(2016, 1, 1),
np.nan,
datetime.date(2016, 1, 3)],
"C": [datetime.date(2016, 1, 1),
np.nan,
datetime.date(2016, 1, 3)]
})
print (df)
#[300000 rows x 3 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
df1 = df.copy()
df2 = df.copy()
def a(df):
df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
return df
def b(df):
df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
return df
def c(df):
df.A = pd.to_datetime(df.A)
df.B = pd.to_datetime(df.B)
df.C = pd.to_datetime(df.C)
return df
计时代码:
In [28]: %timeit (c(df2))
100 loops, best of 3: 4.55 ms per loop
In [29]: %timeit (b(df1))
100 loops, best of 3: 12.8 ms per loop
In [30]: %timeit (a(df))
100 loops, best of 3: 12.8 ms per loop
df = pd.DataFrame({"A": [np.nan,
datetime.date(2016, 1, 2),
np.nan],
"B": [datetime.date(2016, 1, 1),
np.nan,
datetime.date(2016, 1, 3)],
"C": [datetime.date(2016, 1, 1),
np.nan,
datetime.date(2016, 1, 3)]
})
print (df)
#[300000 rows x 3 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
df1 = df.copy()
df2 = df.copy()
def a(df):
df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
return df
def b(df):
df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
return df
def c(df):
df.A = pd.to_datetime(df.A)
df.B = pd.to_datetime(df.B)
df.C = pd.to_datetime(df.C)
return df
好极了!我尝试了这个方法,但没有在每个列上应用pd.to\u datetime
函数,所以它给了我一个错误。这是可行的,但有点烦人,我不得不在列中循环。只有3个这样做(在时间允许时接受答案),我将它设置为循环,以便它可以扩展,但我更愿意做pd.to_datetime(df[['A','B']])
。我添加了计时,如果只有3列,最快的解决方案是将代码重复3次,或者更好的方法是使用apply
。如果有更多的列,concat
解决方案会更快。我仍然有一个问题。这在这个例子中起了作用,但在我的真实数据中却没有,我不知道为什么。我正在用更多的示例输出更新问题。刚刚更新。我猜这是一个日期格式的东西,因为我的真实数据上列出了小时数。顺便说一句,我并不是落选者,太好了!我尝试了这个方法,但没有在每个列上应用pd.to\u datetime
函数,所以它给了我一个错误。这是可行的,但有点烦人,我不得不在列中循环。只有3个这样做(在时间允许时接受答案),我将它设置为循环,以便它可以扩展,但我更愿意做pd.to_datetime(df[['A','B']])
。我添加了计时,如果只有3列,最快的解决方案是将代码重复3次,或者更好的方法是使用apply
。如果有更多的列,concat
解决方案会更快。我仍然有一个问题。这在这个例子中起了作用,但在我的真实数据中却没有,我不知道为什么。我正在用更多的示例输出更新问题。刚刚更新。我猜这是一个日期格式的东西,因为我的真实数据上列出了小时数。顺便说一句,我不是落选者。