如何从可能是布尔值或字符串“1”的列中进行选择?

时间:2016-05-09 19:51:13

标签: python pandas dataframe

我有一个从数据库中获取的pandas数据帧,所以我对格式没有多少控制权。出于无法解释的原因,在某些情况下,查询返回True / False,在其他情况下,它返回1 / NULL。这将进入csv,然后将其读入数据帧。

如果列是True / False,它们被正确读取,我可以说:

DF = DF[DF['column']]

仅获取列为True的行。太棒了。

然而,当数据为1 / Null时,1是一个字符串,所以一切都搞砸了。

我想做:

DF = DF[ DF['column'] or DF['column'] == '1']

然而,这不起作用。

或者,如果有办法轻松检查我是否有'1'/'',如果有,请将列转换为True / False,这也可以。

3 个答案:

答案 0 :(得分:1)

这并不容易,因为数字1相等True。所以我首先将值转换为string,然后按str.contains检查字符串1

DF = pd.DataFrame({'column':[True, True, 1,  1, 1]})
print DF

  column
0   True
1   True
2      1
3      1
4      1

print DF[DF['column'].astype(str).str.contains('1')]

  column
2      1
3      1
4      1

或使用旧的Ayhan解决方案:

print  DF[DF['column'].astype(str) == '1' ]

  column
2      1
3      1
4      1

编辑:

如果您需要检查True或号码1

DF = pd.DataFrame({'column':[True, True, 1,  1, 1, False, 2]})
print DF
  column
0   True
1   True
2      1
3      1
4      1
5  False
6      2

print DF[DF['column'] == 1]
  column
0   True
1   True
2      1
3      1
4      1

print DF[DF['column'] == True]
  column
0   True
1   True
2      1
3      1
4      1

它有效,因为True在比较中等于1

答案 1 :(得分:0)

如果您从一个知道自己会遇到这些情况的数据库中拔出,为什么不进行全面替换呢?

In [70]:  df = pd.DataFrame(data={'a': ['hello',True,''], "b": 

[1,'bar',None]}, index=['row1','row2', 'row3'])

In [71]:  df.replace(to_replace={1:True,'1':True,'':False,None:False})
Out[71]:
          a      b
row1  hello   True
row2   True    bar
row3  False  False

In [72]: df
Out[72]:
          a     b
row1  hello     1
row2   True   bar
row3         None

In [73]:

使用这种方法,您可以拥有一个您想要替换的值的干净映射字典。

如果只有特定列可用于它,也可以在列级别完成:

In [6]: df.a.replace({np.bool(1):True, np.bool(0):False, 1:True,'1':True,'':False,None:False}, inplace=True)

In [7]: df
Out[7]:
               a      b
row1       hello      1
row2        True    bar
row3       False   None
npboolrow   True  False

答案 2 :(得分:0)

你很接近,只需将每个规则括在括号中并使用|对于逻辑OR。

In [1]: DF = pd.DataFrame({'column':[True, True, 1,  '1', 1, False, 2]})

In [2]: DF[(DF['column'] == True) | (DF['column'] == 1)]
Out[2]:
  column
0   True
1   True
2      1
4      1

您可以以相同的方式添加第三条规则

In [3]: DF[(DF['column'] == True) | (DF['column'] == 1) | (DF['column'] == '1')]
Out[3]:
  column
0   True
1   True
2      1
3      1
4      1