我想根据不同 pandas 数据框中 Nan 值的位置将 pandas 数据框中的值更改为 Nan。我想在数组中的多个位置执行此操作。因此,如果它位于索引(行)值相同的数组开头,则它可以工作。如果我想将其设置为在箭头中偏移 20 行,然后偏移 40 行,该怎么办?
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': list(range(0,100)), 'B': list(range(0,100))})
df2_null = df2.isnull()
df[df2_null] = np.NaN
df.iloc[0:4]
df2 = pd.DataFrame({'A': [1, None, 1, 1], 'B': [None, 1, None, 1]})
df2_null = df2.isnull()
df[df2_null] = np.NaN
df.iloc[0:4]
我如何让它在下面工作? 因为第一行给出了一个错误,第二行会重现所有 np.Nan 无论我在哪里执行它。我一直不知道如何做到这一点。
df.iloc[20:24][df2_null] = np.Nan
df.loc[df[df2_null].iloc[20:24].index] = np.NaN
最佳答案
我相信需要DataFrame.iloc
和 DataFrame.mask
,默认情况下通过 bool 掩码将值设置为 NaN
(只需使用 bool 掩码所选 df
的行数和列数相同)。
此外,df2_null
掩码会转换为 numpy 数组,以避免按索引对齐。
df.iloc[20:24] = df.iloc[20:24].mask(df2_null.values)
print (df.iloc[15:30])
A B
15 15.0 15.0
16 16.0 16.0
17 17.0 17.0
18 18.0 18.0
19 19.0 19.0
20 20.0 NaN
21 NaN 21.0
22 22.0 NaN
23 23.0 23.0
24 24.0 24.0
25 25.0 25.0
26 26.0 26.0
27 27.0 27.0
28 28.0 28.0
29 29.0 29.0
Numpy 解决方案 numpy.where
,与 pandas 解决方案原理相同:
df = pd.DataFrame({'A': list(range(0,30)), 'B': list(range(0,30))})
arr = df.values.astype(float)
arr[20:24] = np.where(df2_null.values, np.nan, arr[20:24])
print (arr)
[[ 0. 0.]
[ 1. 1.]
[ 2. 2.]
[ 3. 3.]
[ 4. 4.]
[ 5. 5.]
[ 6. 6.]
[ 7. 7.]
[ 8. 8.]
[ 9. 9.]
[10. 10.]
[11. 11.]
[12. 12.]
[13. 13.]
[14. 14.]
[15. 15.]
[16. 16.]
[17. 17.]
[18. 18.]
[19. 19.]
[20. nan]
[nan 21.]
[22. nan]
[23. 23.]
[24. 24.]
[25. 25.]
[26. 26.]
[27. 27.]
[28. 28.]
[29. 29.]]
关于python - 使用 iloc 和 bool 掩码设置数据帧(数据帧中多个不同索引(行)值的掩码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51942957/