我想根据另一只熊猫数据框中Nan值的位置,将熊猫数据框中的Nan值更改为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
答案 0 :(得分:2)
我认为需要DataFrame.iloc
和DataFrame.mask
,它们默认情况下通过布尔掩码将值设置为NaN
(仅需要与布尔值相同的选定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.where
的Numpy解决方案,与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.]]