我正在使用pandas在Python中使用DataFrame,并且我正在try 应用多个条件来根据多个列的温度值过滤行.然而,在应用我的条件并使用dropna()后,即使我希望一些数据满足这些条件,我最终得到零行.

目标是与环境温度+40 C进行比较,如果值大于此,则用NaN替换.否则,保留原来的价值.

以下是我的DataFrame示例以及我正在应用的条件:

data = {
    'Datetime': ['2022-08-04 15:06:00', '2022-08-04 15:07:00', '2022-08-04 15:08:00', 
                 '2022-08-04 15:09:00', '2022-08-04 15:10:00'],
    'Temp1': [53.4, 54.3, 53.7, 54.3, 55.4],
    'Temp2': [57.8, 57.0, 87.0, 57.2, 57.5],
    'Temp3': [59.0, 58.8, 58.7, 59.1, 59.7],
    'Temp4': [46.7, 47.1, 80, 46.9, 47.3],
    'Temp5': [52.8, 53.1, 53.0, 53.1, 53.4],
    'Temp6': [50.1, 69, 50.3, 50.3, 50.6],
    'AmbientTemp': [29.0, 28.8, 28.6, 28.7, 28.9]
}
df1 = pd.DataFrame(data)
df1['Datetime'] = pd.to_datetime(df1['Datetime'])
df1.set_index('Datetime', inplace=True)

Code:

temp_cols = ['Temp1', 'Temp2', 'Temp3', 'Temp4', 'Temp5', 'Temp6']
ambient_col = 'AmbientTemp'

condition = (df1[temp_cols].lt(df1[ambient_col] + 40, axis=0))

filtered_df = df1[condition].dropna()
print(filtered_df.shape)

Response:

(0, 99)

Problem:

尽管期望满足条件的有效数据,但在应用过滤器并删除NaN值后,生成的DataFrame仍为空.是什么导致了此问题?如何纠正它?

推荐答案

使用DataFrame.where:

condition = (df1[temp_cols].lt(df1[ambient_col] + 40, axis=0))

df1[temp_cols] = df1[temp_cols].where(condition)

如果需要新的数据框架,添加DataFrame.reindex:

temp_cols = ['Temp1', 'Temp2', 'Temp3', 'Temp4', 'Temp5', 'Temp6']
ambient_col = 'AmbientTemp'

condition = (df1[temp_cols].lt(df1[ambient_col] + 40, axis=0))

filtered_df = df1.where(condition.reindex(df1.columns, fill_value=True, axis=1))
print(filtered_df)
                     Temp1  Temp2  Temp3  Temp4  Temp5  Temp6  AmbientTemp
Datetime                                                                  
2022-08-04 15:06:00   53.4   57.8   59.0   46.7   52.8   50.1         29.0
2022-08-04 15:07:00   54.3   57.0   58.8   47.1   53.1    NaN         28.8
2022-08-04 15:08:00   53.7    NaN   58.7    NaN   53.0   50.3         28.6
2022-08-04 15:09:00   54.3   57.2   59.1   46.9   53.1   50.3         28.7
2022-08-04 15:10:00   55.4   57.5   59.7   47.3   53.4   50.6         28.9

How it working:

#mask
print(condition)
                     Temp1  Temp2  Temp3  Temp4  Temp5  Temp6
Datetime                                                     
2022-08-04 15:06:00   True   True   True   True   True   True
2022-08-04 15:07:00   True   True   True   True   True  False
2022-08-04 15:08:00   True  False   True  False   True   True
2022-08-04 15:09:00   True   True   True   True   True   True
2022-08-04 15:10:00   True   True   True   True   True   True

#added Trues values in mask for missing columns - here `AmbientTemp`
print (condition.reindex(df1.columns, fill_value=True, axis=1))
                     Temp1  Temp2  Temp3  Temp4  Temp5  Temp6  AmbientTemp
Datetime                                                                  
2022-08-04 15:06:00   True   True   True   True   True   True         True
2022-08-04 15:07:00   True   True   True   True   True  False         True
2022-08-04 15:08:00   True  False   True  False   True   True         True
2022-08-04 15:09:00   True   True   True   True   True   True         True
2022-08-04 15:10:00   True   True   True   True   True   True         True

Python相关问答推荐

Inquirer库不适用于Pyterfly

单击Cookie横幅错误并在Selenium中启用搜索栏

如何在Pandas 中存储二进制数?

使用Python OpenCV的文本检测分割

Polars -转换为PL后无法计算熵.列表

Plotly:如何更改Heatmap中彩色条的勾选文本

jit JAX函数中的迭代器

使用polars .滤镜进行切片速度比pandas .loc慢

为什么这个带有List输入的简单numba函数这么慢

基于字符串匹配条件合并两个帧

Telethon加入私有频道

如何在python polars中停止otherate(),当使用when()表达式时?

如何获得每个组的时间戳差异?

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

让函数调用方程

如何使用SentenceTransformers创建矢量嵌入?

使用特定值作为引用替换数据框行上的值

判断solve_ivp中的事件

Flash只从html表单中获取一个值

Maya Python脚本将纹理应用于所有对象,而不是选定对象