这是我的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 )
请帮忙!
答案 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