我有一个从数据库中获取的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,这也可以。
答案 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