如何使用pandas迭代所有列并将输出保存到文件

时间:2018-03-06 13:01:08

标签: python pandas matrix

我想迭代数据集中的所有列,并发现列是否包含一个或零。

我的数据集是一个68x300000的矩阵。

我正在使用pandas阅读文件:

df= pd.read_csv("filepath", header=None)

从这个输出中我想创建一个1x300000的新矩阵,详细说明哪一列是一个或零。

是否有允许我这样做的功能?哪种方法最有效?

2 个答案:

答案 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

如果要检查某些列是否只有01值:

b = ((df.values == 0) | (df.values == 1)).all(axis=0).astype(int)
print (b)
[0 0 0 1 0 0]

如果要检查某些列的01值是否至少一次:

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}}