python - 如何在某些 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],
"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),所以我想用前一个替换它们(或者下一个,以防前一个没有) t 存在吗?)在同一列中的值。因此,例如在 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
我正在考虑一个函数:
过滤器以仅显示给定列中值大于例如 40 的行,
抓住那一排的
.loc
基于此
.loc
,在同一列中获取上一行的值用前一行的值替换坏值
我该怎么做,或者有其他更好的方法吗?.loc
对这个有好处吗?感谢您的任何帮助。
编辑:我能够做到这一点的功能:
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
然后使用布尔索引并使用两者ffill()
并bfill
确保填充所有缺失值:
df.loc[:,:'C'] = df.loc[:,:'C'].where(m).ffill().bfill()
A B C Datetime
0 1.0 -5.0 4.0 2018-01-01
1 4.5 -18.1 4.0 2018-01-02
2 8.0 -7.3 3.0 2018-01-03
3 11.1 -7.3 7.0 2018-01-04
4 11.1 -21.5 7.0 2018-01-05
推荐阅读
- linux - 如何设置我的新终端以保留以前终端的会话?
- google-apps-script - 请告诉我如何安全地在 GoogleAppScript 的属性中保存访问密钥和密钥
- html - 带有 svg 和 div 的讨厌的条带
- asp.net-core - Blazor 异常 - 当前线程未与 Dispatcher 关联。使用 InvokeAsync()
- javascript - 加载值时如何在extJS中更新网格存储数据中的值
- cuda - 我可以获得用作 __nv_nvrtc_builtin_header.h 的内容吗?
- java - 有没有办法只刷新 Spring MVC Controller 中的视图?
- javascript - 如何在另一个数组中对属性上的对象数组进行抓取?
- python - 基于python提取文本文件数据
- c# - C# - 如何使用 ref 结构作为泛型类型参数?