python iloc索引与Dataframe中的布尔索引相结合

vltsax25  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(122)

我查看了现有的索引线程,没有一个线程能解决当前的用例。
我想根据DataFrame中的特定值在其中的位置来改变它们,即,我想让第二列从第一行到第四行的值为NaN,第三列、第一行和第二行的值为NaN,假设我们有以下“DataFrame”:

df = pd.DataFrame(np.random.standard_normal((7,3)))
print(df)
          0         1         2
0 -1.102888  1.293658 -2.290175
1 -1.826924 -0.661667 -1.067578
2  1.015479  0.058240 -0.228613
3 -0.760368  0.256324 -0.259946
4  0.496348  0.437496  0.646149
5  0.717212  0.481687 -2.640917
6 -0.141584 -1.997986  1.226350

我想用最少的代码改变df如下:

0         1         2
0 -1.102888       NaN       NaN
1 -1.826924       NaN       NaN
2  1.015479       NaN -0.228613
3 -0.760368       NaN -0.259946
4  0.496348  0.437496  0.646149
5  0.717212  0.481687 -2.640917
6 -0.141584 -1.997986  1.226350

我尝试使用布尔索引.loc,但导致错误:

df.loc[(:2,1:) & (2:4,1)] = np.nan

# exception message:
df.loc[(:2,1:) & (2:4,1)] = np.nan
            ^
SyntaxError: invalid syntax

我也考虑过将DataFrame对象转换为numpy narray对象,但我不知道在这种情况下如何使用布尔值。

5anewei6

5anewei61#

一种方法是定义要求并明确分配:

d = {1:4,2:2}
for col,val in d.items():
    df.iloc[:val,col] = np.nan
print(df)
0         1         2
0 -1.102888       NaN       NaN
1 -1.826924       NaN       NaN
2  1.015479       NaN -0.228613
3 -0.760368       NaN -0.259946
4  0.496348  0.437496  0.646149
5  0.717212  0.481687 -2.640917
6 -0.141584 -1.997986  1.226350

相关问题