Python Pandas:TypeError:“>”在选择日期列时,在“int”和“str”实例之间不受支持
我有一个带有时间戳的列的数据帧。我可以从此列中选择日期范围。但是在我更改了DataFrame中的其他列之后,我无法再更改了,我得到了错误TypeError:“>”在“int”和“str”的实例之间不受支持 下面的代码再现了该问题: 生成带有一些随机数的数据帧 添加带有日期的列 在“日期”列中选择Python Pandas:TypeError:“>”在选择日期列时,在“int”和“str”实例之间不受支持,python,pandas,Python,Pandas,我有一个带有时间戳的列的数据帧。我可以从此列中选择日期范围。但是在我更改了DataFrame中的其他列之后,我无法再更改了,我得到了错误TypeError:“>”在“int”和“str”的实例之间不受支持 下面的代码再现了该问题: 生成带有一些随机数的数据帧 添加带有日期的列 在“日期”列中选择 df = pd.DataFrame(np.random.random((200,3))) df['date'] = pd.date_range('2000-1-1', periods=200, freq
df = pd.DataFrame(np.random.random((200,3)))
df['date'] = pd.date_range('2000-1-1', periods=200, freq='D')
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')
print(df.loc[mask])
但是,现在如果列0超过0.7,我将其设置为0,并重复:
df[df[0] > 0.7] = 0
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')
为什么会发生这种情况以及如何避免这种情况?如果检查输出问题是DateTime设置为0,因为没有为set指定列,所以请设置所有列:
df[df[0] > 0.7] = 0
print (df.head(10))
0 1 2 date
0 0.420593 0.519151 0.149883 2000-01-01 00:00:00
1 0.014364 0.503533 0.601206 2000-01-02 00:00:00
2 0.099144 0.090100 0.799383 2000-01-03 00:00:00
3 0.411158 0.144419 0.964909 2000-01-04 00:00:00
4 0.151470 0.424896 0.376281 2000-01-05 00:00:00
5 0.000000 0.000000 0.000000 0
6 0.292871 0.868168 0.353377 2000-01-07 00:00:00
7 0.536018 0.737273 0.356857 2000-01-08 00:00:00
8 0.364068 0.314311 0.475165 2000-01-09 00:00:00
9 0.000000 0.000000 0.000000 0
解决方案仅由以下数值列设置:
另一种解决方案是创建DatetimeIndex,如果其他所有列都是数字:
df = df.set_index('date')
df.loc[df[0] > 0.7] = 0
print (df.head(10))
0 1 2
date
2000-01-01 0.316875 0.584754 0.925727
2000-01-02 0.000000 0.000000 0.000000
2000-01-03 0.326266 0.746555 0.825070
2000-01-04 0.492115 0.508553 0.971966
2000-01-05 0.160850 0.403678 0.107497
2000-01-06 0.000000 0.000000 0.000000
2000-01-07 0.047433 0.103412 0.789594
2000-01-08 0.527788 0.415356 0.926681
2000-01-09 0.468794 0.458531 0.435696
2000-01-10 0.261224 0.599815 0.435548
您可以将时间戳时间戳'2000-01-01 00:00:00'与字符串进行比较,pandas将为您将字符串转换为时间戳。但一旦将该值设置为0,就无法将int与str进行比较 另一种解决方法是改变操作顺序
filters = df[0] > 0.7
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')
df[filters] = 0
print(df.loc[mask & filters])
那么你应该不会对原来的面具有任何问题。对我来说,这是循环的问题 确保在获取特定的过滤数据帧时,通过以下方式将数据时间列更改为日期时间列:
df_new['date-like_column'] = pd.to_datetime(df_new['date-like-column']
df = df.set_index('date')
df.loc[df[0] > 0.7] = 0
print (df.head(10))
0 1 2
date
2000-01-01 0.316875 0.584754 0.925727
2000-01-02 0.000000 0.000000 0.000000
2000-01-03 0.326266 0.746555 0.825070
2000-01-04 0.492115 0.508553 0.971966
2000-01-05 0.160850 0.403678 0.107497
2000-01-06 0.000000 0.000000 0.000000
2000-01-07 0.047433 0.103412 0.789594
2000-01-08 0.527788 0.415356 0.926681
2000-01-09 0.468794 0.458531 0.435696
2000-01-10 0.261224 0.599815 0.435548
filters = df[0] > 0.7
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')
df[filters] = 0
print(df.loc[mask & filters])
df.loc[df[0] > 0.7, 0] = 0
df_new['date-like_column'] = pd.to_datetime(df_new['date-like-column']