迭代到Pandas Dataframe列时如何删除行?

时间:2019-07-04 15:51:45

标签: python pandas csv dataframe

这是我的csv文件:

A  B  C  D  J
0  1  0  0  0
0  0  0  0  0
1  1  1  0  0
0  0  0  0  0
0  0  7  0  7

我每次都需要选择两列,如果有两个0,我会验证此条件。删除行,例如,我选择A和B

Input

A  B  
0  1  
0  0  
1  1  
0  0  
0  0  

Output 
A  B  
0  1  
1  1  

然后我选择A和C ..

我将这段代码用于A和B,但返回错误

import pandas as pd 
df = pd.read_csv('Book1.csv')

a=df['A']
b=df['B']

indexes_to_drop = []

for i in df.index:
   if df[(a==0) & (b==0)] :
   indexes_to_drop.append(i)

df.drop(df.index[indexes_to_drop], inplace=True )

请帮忙!

2 个答案:

答案 0 :(得分:1)

请勿重复。创建一个布尔系列来切片您的DataFrame:

cols = ['A', 'B']

m = df[cols].ne(0).any(1)
df.loc[m]

   A  B  C  D  J
0  0  1  0  0  0
2  1  1  1  0  0

您可以获得所有组合,并将它们与dict一起存储在itertools.combinations中。使用.loc选择您要关注的行和列。

from itertools import combinations

d = {c: df.loc[df[list(c)].ne(0).any(1), list(c)]
     for c in list(combinations(df.columns, 2))}

d[('A', 'B')]
#   A  B
#0  0  1
#2  1  1

d[('C', 'J')]
#   C  J
#2  1  0
#4  7  7

答案 1 :(得分:1)

首先,我们将您希望的A列与其余所有列进行组合,然后使用iloc为每个列组合选择正确的行:

idx_ranges = [[0,i] for i in range(1, len(df.columns))]
dfs = [df[df.iloc[:, idx].ne(0).any(axis=1)].iloc[:, idx] for idx in idx_ranges]
print(dfs[0], '\n')
print(dfs[1], '\n')
print(dfs[2], '\n')
print(dfs[3])

   A  B
0  0  1
2  1  1 

   A  C
2  1  1
4  0  7 

   A  D
2  1  0 

   A  J
2  1  0
4  0  7