我想迭代数据集中的所有列,并发现列是否包含一个或零。
我的数据集是一个68x300000的矩阵。
我正在使用pandas阅读文件:
df= pd.read_csv("filepath", header=None)
从这个输出中我想创建一个1x300000的新矩阵,详细说明哪一列是一个或零。
是否有允许我这样做的功能?哪种方法最有效?
答案 0 :(得分:0)
我认为需要:
df = pd.DataFrame({0:list('abcdef'),
1:[4,1,4,5,5,4],
2:[7,0,9,4,2,3],
3:[1,0,1,0,1,0],
4:[5,3,6,0,2,4],
5:list('aaabbb')})
print (df)
0 1 2 3 4 5
0 a 4 7 1 5 a
1 b 1 0 0 3 a
2 c 4 9 1 6 a
3 d 5 4 0 0 b
4 e 5 2 1 2 b
5 f 4 3 0 4 b
如果要检查某些列是否只有0
和1
值:
b = ((df.values == 0) | (df.values == 1)).all(axis=0).astype(int)
print (b)
[0 0 0 1 0 0]
如果要检查某些列的0
和1
值是否至少一次:
c = ((df.values == 0) | (df.values == 1)).any(axis=0).astype(int)
print (c)
[0 1 1 1 1 0]
c = df.isin([0, 1]).any().astype(int)
print (c)
0 0
1 1
2 1
3 1
4 1
5 0
dtype: int32
<强>计时强>:
np.random.seed(456)
df = pd.DataFrame(np.random.randint(3, size=(68,300000)))
#print (df)
In [272]: %timeit df.columns[df.isin([0, 1]).any()]
1 loop, best of 3: 323 ms per loop
In [273]: %timeit df.columns.values[((df.values == 0) | (df.values == 1)).any(axis=0)]
10 loops, best of 3: 48.8 ms per loop
答案 1 :(得分:0)
您应该使用numpy
。以下是一个例子。
import numpy as np
df = pd.DataFrame([[1, 2, 3],
[0, 1, 5],
[8, 9, 10]],
columns=['A', 'B', 'C'])
a = df.values
result = df.columns[((a == 0) | (a == 1)).any(axis=0)]
Index(['A', 'B'], dtype='object')
以下内容可能足以满足您的更新要求。它还涉及列中包含0 和 1的实例。
res = {col: {k: (a[:, i] == k).any() for k in (0, 1)} for i, col in enumerate(df)}
{'A': {0: True, 1: True}, 'B': {0: False, 1: True}, 'C': {0: False, 1: False}}