如何在Pandas中比较和解析DataFrame行中的NaN值



我试图比较同一行中的两个值,看看哪个更大。这两行是这样的日期:

PheneVisit  PheneDate   ER Date
phchp010v3  9/22/06 
phchp010v3  9/22/06     5/1/20
phchp101v1  9/14/09 
phchp101v1  9/14/09 

我想把最高值放在一个名为";日期";使用下面的代码,但它不会捕获ER Date列的空白/NaN值,并且如果没有ER Date,它只会生成更多的NaN列。

这是我目前拥有的代码:

for index, row in data.iterrows():
if (pd.to_datetime(row['PheneDate']) > pd.to_datetime(row['ER Date'])) or (row['ER Date'] == 0):
print('1')
data["date order"] = data['PheneDate']
elif pd.to_datetime(row['ER Date']) > pd.to_datetime(row['PheneDate']) or [row['PheneDate'] == 0]:
print(2)
data["date order"] = data['ER Date']

它产生以下输出:

date order
5/1/20

所需输出为

9/22/06
5/1/20
9/14/09
9/14/09

**我只需要检查每个单元格中NaN的值,如果它是空的,那么应该使用非空日期。我还试过==='nan'和===0**

您可以使用pandas.to_datetime转换为日期时间类型并使用正常比较:

df['PheneDate'] = pd.to_datetime(df['PheneDate'])
df['ER'] = pd.to_datetime(df['ER'])
df['Date'] = df[['PheneDate', 'ER']].max(axis=1)

输出:

PheneVisit  PheneDate         ER       Date
0  phchp010v3 2006-09-22        NaT 2006-09-22
1  phchp010v3 2006-09-22 2020-05-01 2020-05-01
2  phchp101v1 2009-09-14        NaT 2009-09-14
3  phchp101v1 2009-09-14        NaT 2009-09-14

如果您需要转换回具有特定区域格式的字符串,请使用以下方法:

>>> df['Date'].dt.strftime('%m/%d/%y')
0    09/22/06
1    05/01/20
2    09/14/09
3    09/14/09

最后,如果你真的想避免在月/日格式中使用前导零:

>>> df['Date'].dt.strftime('%-m/%-d/%y')
0    9/22/06
1     5/1/20
2    9/14/09
3    9/14/09

尝试numpy where:

df['new_col'] = np.where(df['ER Date'] > df['PheneDate'], df['ER Date'], df['PheneDate'])

最新更新