【问题标题】:For loop using np.where使用 np.where 循环
【发布时间】:2019-08-11 18:45:45
【问题描述】:

我正在尝试在数据框中创建一个新列,用于标记用 1 驯化的动物。我正在使用 for 循环,但由于某种原因,该循环仅选取 @987654321 中的最后一项@ 列表。 dogcatgerbil 都应在 domesticated 列下分配 1。有人对此有解决方案或有更好的方法吗?

df = pd.DataFrame(
    {'creature': ['dog', 'cat', 'gerbil', 'mouse', 'donkey']
    })

pets = ['dog', 'cat', 'gerbil']

for pet in pets:
    df['domesticated'] = np.where(df['creature']==pet, 1, 0)

df

【问题讨论】:

    标签: python pandas numpy dataframe where


    【解决方案1】:

    您在最后一次循环迭代中将所有非沙鼠设置为0。也就是说,当您上次迭代中petgerbil 时,所有不等于gerbil 的条目将对应于0。这包括 dogcat 的条目。您应该一次检查pets 中的所有值。试试这个:

    df['domesticated'] = df['creature'].apply(lambda x: 1 if x in pets else 0)
    

    如果你想坚持np.where

    df['domesticated'] = np.where(df['creature'].isin(pets), 1, 0)
    

    【讨论】:

    • 这很棒。当我被允许时,我会勾选这个。你知道为什么 for 循环在这种情况下不起作用吗?我在pets 列表中包含了dogcatgerbil,所以我认为迭代该列表可以正常工作。
    • 我更详细地更新了我的帖子。这个想法是最后一次迭代会覆盖之前的所有内容,因此您实际上只是检查等于 gerbil 的值。
    【解决方案2】:

    问题是每个循环都会重置您的结果。

    df['domesticated'] = df.isin(pets).astype(int)
    
      creature  domesticated
    0      dog             1
    1      cat             1
    2   gerbil             1
    3    mouse             0
    4   donkey             0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2019-03-10
      • 2018-06-04
      • 2019-10-03
      • 1970-01-01
      相关资源
      最近更新 更多