我想用&过滤数据,但结果错误

时间:2018-10-17 01:42:44

标签: python pandas dataframe preprocessor

这是我的数据框,我想同时将满足busSpeed<3sationUuid==1的值设置为NAN,但结果却是错误的,有人帮忙,谢谢

下面是我的代码

import pandas as pd
import numpy as np
df=pd.read_excel('d:gps/9-20-32-36574.xlsx')
df.sationUuid.fillna(method='bfill',inplace=True)
df.dropna(subset=['sationUuid'],inplace=True)
df1=list()
for i in range(len(df)):
    if((df.sationUuid[i]==1)&(df.busSpeed[i]<3)):
        df1.append(df.replace(df.busSpeed[i],np.NAN))

这是处理之前的数据

original data

这是我得到的结果


result

sationuuid大于1的值也被设置为nan,if语句似乎只busSpeed<3起作用,这是怎么发生的

1 个答案:

答案 0 :(得分:1)

您可以通过Pandas查询而不是使用循环和if块来做到这一点。使用Pandas查询具有比使用循环效率高得多的好处。要替换满足您条件的值,可以将赋值与.loc一起使用。

这是一个例子:

import pandas as pd
import numpy as np

df = pd.read_excel('d:gps/9-20-32-36574.xlsx')
df.sationUuid.fillna(method='bfill',inplace=True)
df.dropna(subset=['stationUuid'],inplace=True)

mask = (df.stationUuid == 1) & (df.busSpeed < 3)
df.loc[mask, 'busSpeed'] = np.nan

因此,从Excel中读取后,如果df如下所示:

stationUuid  busSpeed
1            1.5
2            1
1            100
3            10

然后df在脚本的其余部分之后将如下所示:

stationUuid  busSpeed
1            NaN
2            1
1            100
3            10