Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:根据其他列和值本身更改单元格值_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫:根据其他列和值本身更改单元格值

Python 熊猫:根据其他列和值本身更改单元格值,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下建议: category1 category2 A B A C B NaN A NaN 如果满足以下条件,我想将类别2中的值更改为D: category1==A category2==NaN 因此,我的预期产出是: category1 category2 A B A C B NaN A D 我尝试了两种方法: df

我有以下建议:

category1   category2
A           B
A           C
B           NaN
A           NaN
如果满足以下条件,我想将
类别2中的值更改为
D

  • category1==A
  • category2==NaN
因此,我的预期产出是:

category1   category2
A           B
A           C
B           NaN
A           D
我尝试了两种方法:

df.loc[((df.category1 == "A") & (df.category2 == 'nan')), "category2"] = "D" # doesn't change anything

为什么这两行都不起作用?

请使用以下命令:

df.loc[df.category2.isna()&df.category1.eq('A'),'category2']='D'
print(df)

使用以下命令:

df.loc[df.category2.isna()&df.category1.eq('A'),'category2']='D'
print(df)

错误:

ValueError:应同时给出x和y或两者都不给出

告诉您当条件为
True
时,
np.where
需要一个值,可以从中选择,也可以选择
False
。在您的情况下,它只知道当它为
True
时,您需要
D
。相反,你应该:

df['category2'] = np.where(((df['category1'] == 'A') & (df['category2'].isna())),
                             "D", df['category2'])
错误:

ValueError:应同时给出x和y或两者都不给出

告诉您当条件为
True
时,
np.where
需要一个值,可以从中选择,也可以选择
False
。在您的情况下,它只知道当它为
True
时,您需要
D
。相反,你应该:

df['category2'] = np.where(((df['category1'] == 'A') & (df['category2'].isna())),
                             "D", df['category2'])

需要澄清的是,这之所以有效,主要是因为
.isna()
(也可以使用
.isnull()
,它不是使用
.eq()
(你仍然可以使用
=='A'
而不是
.eq('A')
)来获得相同的结果。你原来的代码既不能工作,也不能工作
等于
NaN
。测试pandas中的值是否为null最安全的方法是
。isnull()
只是为了清除,之所以有效的主要原因是因为
。isna()
(也可以使用
.isnull()
,而不是使用
.eq()
(您仍然可以使用
='a'
,而不是
.eq('a'))
用于相同的结果)。原始代码不起作用。bc
'nan'
等于
nan
。测试pandas中的值是否为null的最安全方法是
.isnull()
np。其中
解决方案在编写单个列时比loc[]快一点我猜。
np.where
solution在编写单个列时比loc[]快一点。