Python 如何在某些数据帧列中查找大于/小于给定最大值的值,然后将其替换为前一行';s的价值观?
Dataframe df有“Datetime”和“A”、“B”、“C”列,其中包含一些作为浮点值的温度:Python 如何在某些数据帧列中查找大于/小于给定最大值的值,然后将其替换为前一行';s的价值观?,python,pandas,dataframe,Python,Pandas,Dataframe,Dataframe df有“Datetime”和“A”、“B”、“C”列,其中包含一些作为浮点值的温度: abctemps = {"Datetime": ["2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05"], "A": [1.0,4.5,8.0,11.1,100.2], "B": [-5.0,-18.1,-7.3,-5000.3,-21.5],
abctemps = {"Datetime": ["2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05"],
"A": [1.0,4.5,8.0,11.1,100.2],
"B": [-5.0,-18.1,-7.3,-5000.3,-21.5],
"C": [4,87,3.0,7,81]}
df = pd.DataFrame(abctemps)
df
Datetime A B C
0 2018-01-01 1.0 -5.0 4.0
1 2018-01-02 4.5 -18.1 87.0
2 2018-01-03 8.0 -7.3 3.0
3 2018-01-04 11.1 -5000.3 7.0
4 2018-01-05 100.2 -21.5 81.0
列A、B和C包含温度,但某些值明显太大(或太小)不真实(100.2,-5000.3,87,81),因此我想用前一个值替换它们(或者下一个值,如果前一个值不存在的话?同一列中的值。例如,在A列中,100.2将替换为11.1。或在B列中,-5000.3和-7.3
所需的输出如下所示:
Datetime A B C
0 2018-01-01 1.0 -5.0 4.0
1 2018-01-02 4.5 -18.1 4.0
2 2018-01-03 8.0 -7.3 3.0
3 2018-01-04 11.1 -7.3 7.0
4 2018-01-05 11.1 -21.5 7.0
def longtozero(col, length):
try:
df.loc[df[col].str.len() > length, col] = df.loc[df.loc[df[col].str.len() > length, col].index[0]-1, col]
df[col] = df[col].astype('float64')
except:
pass
我正在考虑一个函数:
.loc
.loc
,获取同一列中前一行的值.loc
对这有好处吗?谢谢你的帮助
编辑:我能够制作一个函数来完成这项工作:
Datetime A B C
0 2018-01-01 1.0 -5.0 4.0
1 2018-01-02 4.5 -18.1 4.0
2 2018-01-03 8.0 -7.3 3.0
3 2018-01-04 11.1 -7.3 7.0
4 2018-01-05 11.1 -21.5 7.0
def longtozero(col, length):
try:
df.loc[df[col].str.len() > length, col] = df.loc[df.loc[df[col].str.len() > length, col].index[0]-1, col]
df[col] = df[col].astype('float64')
except:
pass
然后使用列和所需的最大长度调用函数,例如:
longtozero("A", 3)
您可以从检测每列中的异常值开始。以下是一种方法:
m = df.loc[:,:'C'].apply(lambda x: np.abs(x-x.mean()) <= (x.std()), axis=0)
A B C
0 True True True
1 True True False
2 True True True
3 True False True
4 False True False
如果我复制粘贴第一行(m=df.loc[:,:'C'].apply(lambda x:abs(x)
df
,df.loc[:,:'C']
进行切片的方式是假设datetime列位于末尾。正如您在使用df.loc[:,“A:“C”]时共享数据一样。在我给出的示例中,“datetime”“column是第一列,不是结尾?但它与“A”配合使用:“C”非常感谢您的帮助!如果有人想分享其他方法来做同样的事情,我也会感兴趣。这个解决方案中的(.abs、.std、.ffill和.bfill对我来说是全新的,我也很好奇是否可以用更多的“basic”来完成。”方法,如筛选和.loc)