根据其他列的值将值分配给数据框列的正确方法

我有一个看起来像这样的数据框:


   a     b      c

0  A   1.0   10.0

1  B   2.0   20.0

2  C   3.0   30.0

3  A   4.0   40.0

4  B   5.0   50.0

5  C   6.0   60.0

6  A   7.0   70.0

7  B   8.0   80.0

8  C   9.0   90.0

9  A  10.0  100.0

我想创建一个 'd' 列,其值取决于 'a',这样如果 'a' 列的值在 ['A','B'] 中,则 'd' 列获取 'b' 中的值或否则它获得'c'中的值。我想要的结果是:


   a     b      c     d

0  A   1.0   10.0   1.0

1  B   2.0   20.0   2.0

2  C   3.0   30.0  30.0

3  A   4.0   40.0   4.0

4  B   5.0   50.0   5.0

5  C   6.0   60.0  60.0

6  A   7.0   70.0   7.0

7  B   8.0   80.0   8.0

8  C   9.0   90.0  90.0

9  A  10.0  100.0  10.0

我努力了:


df["d"] = np.nan


for i in range(df.shape[0]):

    if df.a.iloc[i] in ['A','B']:

        df.d.iloc[i] = df.b.iloc[i]

    elif df.a.iloc[i] in ['C']:

        df.d.iloc[i] = df.c.iloc[i]

这给了我想要的答案,但我得到了错误,“SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置一个值”


我也知道 for 循环并不理想,所以我尝试使用布尔掩码来执行此操作,但是


print(df.a in ['A','B'])

给我警告,“ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。”


a) 修复 for 循环或 b) 用更优雅的东西替换 for 循环的最佳方法是什么?我花了一个小时通过 SO,但我找不到针对我的特定问题的好答案。任何帮助表示赞赏。


繁花不似锦
浏览 170回答 2
2回答

鸿蒙传说

您可以使用np.where:In [1696]: df['d'] = np.where(df['a'].isin(['A', 'B']), df['b'], df['c'])     In [1697]: df Out[1697]:    a     b      c     d0  A   1.0   10.0   1.01  B   2.0   20.0   2.02  C   3.0   30.0  30.03  A   4.0   40.0   4.04  B   5.0   50.0   5.05  C   6.0   60.0  60.06  A   7.0   70.0   7.07  B   8.0   80.0   8.08  C   9.0   90.0  90.09  A  10.0  100.0  10.0

九州编程

您可以使用isin和np.select:df['d'] = np.select( (df.a.isin(['A','B']), df.a.eq('C')),                    (df.b, df.c), np.nan)如果a列A,B,C仅包含示例数据中所示的值,您可以简单地使用np.where:df['d'] = np.where(df.a.isin(['A','B']), df.b, df.c)# or# df['d'] = np.where(df.a.eq('C'), df.c, df.b)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python