Python 3.x 从数据帧中选择具有两个级别(二进制变量)的列
我正在尝试选择只有两个值[0,1]的数据字段。我的代码只适用于一列,但是当我尝试循环遍历多列时,它失败了 以下是示例数据集:Python 3.x 从数据帧中选择具有两个级别(二进制变量)的列,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我正在尝试选择只有两个值[0,1]的数据字段。我的代码只适用于一列,但是当我尝试循环遍历多列时,它失败了 以下是示例数据集: df = pd.DataFrame({'a':np.random.randint(0,2, size = (10)), 'b':np.random.randint(0,2, size = (10)), 'c':np.random.randint(0,6, size = (10)),
df = pd.DataFrame({'a':np.random.randint(0,2, size = (10)),
'b':np.random.randint(0,2, size = (10)),
'c':np.random.randint(0,6, size = (10)),
'd': ['x', 'y']*5
})
df
数据如下所示:
df.to_dict()
{'a': {0: 1, 1: 1, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 1, 8: 0, 9: 1},
'b': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1, 6: 1, 7: 1, 8: 0, 9: 1},
'c': {0: 1, 1: 1, 2: 2, 3: 2, 4: 5, 5: 2, 6: 2, 7: 0, 8: 4, 9: 3},
'd': {0: 'x',
1: 'y',
2: 'x',
3: 'y',
4: 'x',
5: 'y',
6: 'x',
7: 'y',
8: 'x',
9: 'y'}}
应选择列“a”和“b”。
下面这行是真的,这就是我想要的
list(set(df[mylist[0]])) == [0,1]
为什么运行此操作时会出现密钥错误:
mylist = list(df.columns)
for i in mylist:
if list(set(df[mylist.index(i)])) == [0,1]:
print(i)
关键错误:0
我试图输出满足IF条件的列名列表
df = pd.DataFrame({'a':np.random.randint(0,2, size = (10)),
'b':np.random.randint(0,2, size = (10)),
'c':np.random.randint(0,6, size = (10)),
'd': ['x', 'y']*5
})
df
使用++: 或 您还可以使用:
df[df.columns[df.isin([0,1]).all()]]
或:
输出:
a b
0 0 1
1 0 1
2 0 1
3 0 1
4 1 1
5 0 1
6 1 0
7 1 1
8 0 1
9 0 0
df[df.isin([0,1]).all(axis=1)]
获取列:
[*df.loc[:,df.isin([0,1]).all()].columns]
#['a', 'b']
要按行选择,只需执行以下操作:
a b
0 0 1
1 0 1
2 0 1
3 0 1
4 1 1
5 0 1
6 1 0
7 1 1
8 0 1
9 0 0
df[df.isin([0,1]).all(axis=1)]
你为什么不工作
您可以使用转置和求和,如下所示
df=pd.DataFrame({'a':{0:1,1:1,2:0,3:0,4:0,5:0,6:0,7:1,8:0,9:1},
‘b’:{0:0,1:0,2:0,3:0,4:0,5:1,6:1,7:1,8:0,9:1},
‘c’:{0:1,1:1,2:2,3:2,4:5,5:2,6:2,7:0,8:4,9:3},
'd':{0:'x',
1:‘y’,
2:'x',
3:‘y’,
4:'x',
5:‘y’,
6:'x',
7:‘y’,
8:'x',
9:'y'}})
##解决方案
df.T[df.sum()=(df==1.sum()].T
我收到以下错误:IndexingError:作为索引器提供的不可对齐的布尔序列(布尔序列的索引和索引对象的索引不匹配——对于第一个选项,第三个选项似乎返回我想要的列。谢谢。但是是什么导致我的原始代码失败?是的,您的代码工作正常,但是我想了解是什么导致我的原始代码失败。有什么想法吗?谢谢。我已经更新了解决方案,以了解w。)为什么会出现错误。
df[df.isin([0,1]).all(axis=1)]
print(mylist)
#['a', 'b', 'c', 'd']
mylist.index('a')
#returns 0
df[0]
#key error 0 because 0 not in list of columnas a,b,c,d...