检查值是否在pandas.DataFrame中的列列表中

时间:2017-03-28 12:50:02

标签: python pandas

我在pandas.DataFrame中处理一些看起来像这样(简化)的数据:

|-----------|-----------|-----------|
| Feature 1 | Feature 2 | Feature 3 |
|-----------|-----------|-----------|
|     A     |     B     |     D     |
|     A     |     A     |     B     |
|     A     |     D     |     A     |
|     A     |     B     |     A     |
|     A     |     A     |     A     |
|     A     |     A     |     D     |
|-----------|-----------|-----------|

我想创建一个新列,回答问题"值是' D'出现在任何一列?"

所以最终的数据看起来像是:

|-----------|-----------|-----------|-----------|
| Feature 1 | Feature 2 | Feature 3 | Feature 4 |
|-----------|-----------|-----------|-----------|
|     A     |     B     |     D     |    True   |
|     A     |     A     |     B     |   False   |
|     A     |     D     |     A     |    True   |
|     A     |     B     |     A     |   False   |
|     A     |     A     |     A     |   False   |
|     A     |     A     |     D     |    True   |
|-----------|-----------|-----------|-----------|

我尝试过使用df.isin()方法,但我仍然无法做到这一点。

你们知道怎么做吗?

3 个答案:

答案 0 :(得分:4)

尝试这种方法:

df[df=='D'].any(1)

答案 1 :(得分:2)

您只需将dfD进行比较,然后按any检查至少一个True

df['Feature 4'] = (df == 'D').any(axis=1)
print (df)
  Feature 1 Feature 2 Feature 3 Feature 4
0         A         B         D      True
1         A         A         B     False
2         A         D         A      True
3         A         B         A     False
4         A         A         A     False
5         A         A         D      True

或者用于比较使用eq

df['Feature 4'] = df.eq('D').any(axis=1)
print (df)
  Feature 1 Feature 2 Feature 3 Feature 4
0         A         B         D      True
1         A         A         B     False
2         A         D         A      True
3         A         B         A     False
4         A         A         A     False
5         A         A         D      True
print (df.eq('D'))
  Feature 1 Feature 2 Feature 3
0     False     False      True
1     False     False     False
2     False      True     False
3     False     False     False
4     False     False     False
5     False     False      True

答案 2 :(得分:0)

为帮助具有相同挑战的任何人,我提出了另一种选择。 您可以将numpy where函数与或一起使用,以检查所有列。

在下面查看样机:

import numpy as np
import pandas as pd

a = [
['A', 'B', 'D'], 
['A','A', 'B'],
['A','D', 'A'],
['A','B', 'A'],
['A','A', 'A'],
['A','A', 'D']
]
df = pd.DataFrame(a, columns=['Feature 1', 'Feature 2', 'Feature 3'])
df['Feature 4'] = np.where((df['Feature 1']=='D') | (df['Feature 2']=='D') |(df['Feature 3']=='D') , True, False)
df

以下结果:

+---+-----------+-----------+-----------+-----------+
|   | Feature 1 | Feature 2 | Feature 3 | Feature 4 |
+---+-----------+-----------+-----------+-----------+
| 0 | A         | B         | D         | True      |
+---+-----------+-----------+-----------+-----------+
| 1 | A         | A         | B         | False     |
+---+-----------+-----------+-----------+-----------+
| 2 | A         | D         | A         | True      |
+---+-----------+-----------+-----------+-----------+
| 3 | A         | B         | A         | False     |
+---+-----------+-----------+-----------+-----------+
| 4 | A         | A         | A         | False     |
+---+-----------+-----------+-----------+-----------+
| 5 | A         | A         | D         | True      |
+---+-----------+-----------+-----------+-----------+