![](/img/trans.png)
[英]How to replace nan values of a column based on certain values of other column
[英]Replace values in column with NaN based on other values in same column
这是标题中问题的特殊情况。
我有以下数据框:
values = [[100,54,25,26,32,33,15,2],[1,2,3,4,5,6,7,8]]
columns = ["numbers", "order"]
zipped = dict(zip(columns,values))
df = pd.DataFrame(zipped)
print(df)
numbers order
0 100 1
1 54 2
2 25 3
3 26 4
4 32 5
5 33 6
6 15 7
7 2 8
想象一下,数据框按列顺序升序排列。 在列号中 ,如果行下方存在较大的值,我想用NaN替换值,并实现以下结果:
numbers order
0 100 1
1 54 2
2 NaN 3
3 NaN 4
4 NaN 5
5 33 6
6 15 7
7 2 8
在没有循环的情况下实现此目标的最佳方法是什么?
更新:初始DF和预期结果的更好的示例(添加要替换的不连续值块):
values = [[100,54,25,26,34,32,31,33,15,2],[1,2,3,4,5,6,7,8,9,10]]
numbers order
0 100 1
1 54 2
2 25 3
3 26 4
4 34 5
5 32 6
6 31 7
7 33 8
8 15 9
9 2 10
结果:
numbers order
0 100.0 1
1 54.0 2
2 NaN 3
3 NaN 4
4 34.0 5
5 NaN 6
6 NaN 7
7 33.0 8
8 15.0 9
9 2.0 10
我的理解略有不同,如果数字低于以下,则表示其反向cummax更高:
In [11]: df.at[3, 'numbers'] = 24 # more illustrative example
In [12]: df.numbers[::-1].cummax()[::-1]
Out[12]:
0 100
1 54
2 33
3 33
4 33
5 33
6 15
7 2
Name: numbers, dtype: int64
In [13]: df.loc[df.numbers < df.numbers[::-1].cummax()[::-1], 'numbers'] = np.nan
In [14]: df
Out[14]:
numbers order
0 100.0 1
1 54.0 2
2 NaN 3
3 NaN 4
4 NaN 5
5 33.0 6
6 15.0 7
7 2.0 8
您可以遍历列的值,并检查它是否大于后面的所有元素:
arr = df['numbers'].values
df['numbers'] = [x if all(x > arr[n+1:]) else np.nan for n, x in enumerate(arr)]
df
输出:
numbers order
0 100.0 1
1 54.0 2
2 NaN 3
3 NaN 4
4 NaN 5
5 33.0 6
6 15.0 7
7 2.0 8
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.