通过同时使用iloc和布尔掩码(数据框中的多个不同索引(行)值处的掩码)来设置数据框

时间:2018-08-21 06:39:27

标签: python pandas dataframe pandas-groupby numpy-broadcasting

我想根据另一只熊猫数据框中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

1 个答案:

答案 0 :(得分:2)

我认为需要DataFrame.ilocDataFrame.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.]]