替换 C 列中的值,其中 A 列中的值为 x

Replace values in Column C where value in Column A is x

问题

在替换空值以使列为布尔值的过程中,我们在 fireplace_count 列中找到了空值。

如果 fireplaceflag 值为 False,则 fireplace_count null 值应替换为 0

为pandas

而写
df_train.loc[(df_train.fireplace_count.isnull()) & (df_train.fireplaceflag==False),'fireplace_count'] = 0

我建议使用 df.fillna() 并将列名放在方法中以定位它,例如:

df['<column_name>']=df.<columnname>.fillna(<new_value>)

您可以将要将空值更改为的新值放在括号中。在您的情况下,这是“0”。让我们也简化问题,因为 None 值的条件似乎是是否存在 False 标志。

我将使用您之前发给我的系列,稍作改动。

import cudf
df = cudf.DataFrame({'basement_flag': [1, 1, 1, 0],
                     'basementsqft': [400,750,500,0],
                     'fireplace_count': [2, None, None, 1], #<-- added a None to illustrate the targeted nature of the solution
                     'fireplaceflag': [10, None, None, 8]})
print(df)
df['fireplace_count']=df.fireplace_count.fillna(0) #<-- This is the solution.  It changes only the values in the column of interest, which is what you explained that you needed
print(df)

输出将是:

   basement_flag  basementsqft  fireplace_count  fireplaceflag
0              1           400                2             10
1              1           750                                
2              1           500                                
3              0             0                1              8
   basement_flag  basementsqft  fireplace_count  fireplaceflag
0              1           400                2             10
1              1           750                0               
2              1           500                0               
3              0             0                1              8

还有...

df['fireplace_count'] = df['fireplace_count'].fillna(0)
df['fireplaceflag']= df['fireplaceflag'].fillna(-1)
df['fireplaceflag'] = df['fireplaceflag'].masked_assign(1, df['fireplace_count'] > 0)

根据我认为你的问题,这应该适用于任何奇怪的情况(感谢 Roy F @ NVIDIA)

让我知道这是否适合您,或者您是否需要更多帮助!

我们正在努力做什么

fireplaceflag 列中的值为 False 的行中(即没有壁炉),将 fireplace_count 列中的 null 值更改为 0

pandas 来自初始问题的代码

df_train.loc[(df_train.fireplace_count.isnull()) & (df_train.fireplaceflag==False),'fireplace_count'] = 0

翻译成 cudf

df_train['fireplace_count'] = df_train['fireplace_count'].masked_assign(0, (df_train['fireplace_count'].isna() == True) & (df_train['fireplaceflag'] == False))

使用 fillna 的公认答案适用于此特定示例,但答案中的通用版本不适用于 cuDF 0.9 中标题中的问题。

cuDF 现在支持 __setitem__() 方法。

的一般情况

"In rows where the value in column_a is X, set the value in column_b to Y", 最好用类似下面的东西来完成:

import cudf
df = cudf.DataFrame({'basement_flag': [1, 1, 1, 0],
                     'basementsqft': [400,750,500,0],
                     'fireplace_count': [2, None, None, 1], #<-- added a None to illustrate the targeted nature of the solution
                     'fireplaceflag': [10, None, None, 8]})
print(df)
​
mask = df.fireplaceflag.isnull()
df.loc[mask, 'fireplace_count'] = 0
print(df)
   basement_flag  basementsqft fireplace_count fireplaceflag
0              1           400               2            10
1              1           750            null          null
2              1           500            null          null
3              0             0               1             8
   basement_flag  basementsqft  fireplace_count fireplaceflag
0              1           400                2            10
1              1           750                0          null
2              1           500                0          null
3              0             0                1             8