【问题标题】:Problems with pandas and numpy where condition/multiple values?pandas 和 numpy 的问题在哪里条件/多个值?
【发布时间】:2016-12-11 09:57:42
【问题描述】:

我有以下 pandas 数据框:

A  B
1  3
0  3
1  2
0  1
0  0
1  4
....
0  0

我想在右侧添加一个新列,遵循以下条件:

如果B 中的值有32,例如在new_col 中添加1

(*)
A  B new_col
1  3  1
0  3  1
1  2  1
0  1  0
0  0  0
1  4  0
....
0  0  0

所以我尝试了以下方法:

df['new_col'] = np.where(df['B'] == 3 & 2,'1','0')

但是没有用:

A  B new_col
1  3  0
0  3  0
1  2  1
0  1  0
0  0  0
1  4  0
....
0  0  0

知道如何使用 pandas 和 numpy 执行多重条件语句,例如 (*)?。

【问题讨论】:

  • 感谢大家的帮助

标签: python python-3.x pandas numpy scipy


【解决方案1】:
df=pd.DataFrame({'A':[1,0,1,0,0,1],'B':[3,3,2,1,0,4]})
print df
df['C']=[1 if vals==2 or vals==3 else 0 for vals in df['B'] ]
print df

   A  B
0  1  3
1  0  3
2  1  2
3  0  1
4  0  0
5  1  4
   A  B  C
0  1  3  1
1  0  3  1
2  1  2  1
3  0  1  0
4  0  0  0
5  1  4  0

【讨论】:

  • @piRSquared:我不明白。期望什么? @john doe:我完全不明白你的评论
  • @piRSquared 感谢您指出这一点。我完全错过了它,但现在我修复了它。
【解决方案2】:

使用 numpy

df['new'] = (df.B.values[:, None] == np.array([2, 3])).any(1) * 1

时间

在给定的数据集上

超过 60,000 行

【讨论】:

  • 看来这是最有效的解决方案,谢谢!
【解决方案3】:

您可以使用 Pandas isin,它会返回一个布尔值,显示您要查找的元素是否包含在 'B' 列中。

df['new_col'] = df['B'].isin([3, 2])
   A  B new_col
0  1  3    True
1  0  3    True
2  1  2    True
3  0  1   False
4  0  0   False
5  1  4   False

然后,您可以使用astypeboolean 值转换为01True1False0

df['new_col'] = df['B'].isin([3, 2]).astype(int)

输出:

   A  B  new_col
0  1  3        1
1  0  3        1
2  1  2        1
3  0  1        0
4  0  0        0
5  1  4        0

【讨论】:

  • 感谢您的帮助,我注意到您使用了isin()。我只是好奇,34 的 ifinsted 呢……我还能用isin() 函数吗?
【解决方案4】:
df['new_col'] = [1 if x in [2, 3] else 0 for x in df.B]

* + ^ 运算符按预期处理布尔值,并与整数混合给出预期结果。所以你也可以这样做:

df['new_col'] = [(x in [2, 3]) * 1 for x in df.B]

【讨论】:

  • 第一和我的答案一样
【解决方案5】:

使用numpy:

>>> df['new_col'] = np.where(np.logical_or(df['B'] == 3, df['B'] == 2), '1','0')
>>> df
   A  B new_col
0  1  3       1
1  0  3       1
2  1  2       1
3  0  1       0
4  0  0       0
5  1  4       0

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多