我需要你们所有人的帮助 我正在使用excel的数据表单,所以基本上现在我有这样的东西。
csr id ac otc tm lease maint
1 456 b 0 0 0 0
1 543 a 0 1 1 0
1 435 e 0 0 0 0
2 123 w 1 1 1 1
2 123 g 0 0 0 0
3 987 j 0 0 0 0
4 258 k 1 1 1 1
4 258 m 0 0 0 0
所以我需要删除“otc”'tm''lease''maint'列中的零行。我做这样的事情
df = pd.read_excel(xlsx,'Sheet1')
df_zero = df[(df['OTC'] == 0) & (df['TM'] == 0) & (df['Lease'] == 0) & (df['Maint'] == 0) & (df['Support'] == 0) & (df['Other'] == 0)]
通过这种方式,我打开文件并在df_zero中保存特定列中包含零的所有行。然后
df1 = df_zero.loc[:, 'CSR']
基本上在df1中保存特定列中零的行的CSR编号,如下所示
csr
1
1
2
3
4
所以我认为我这样做并解决了问题。
for n1 in df1:
df = df[df.CSR != n1]
但问题是,正如你在CSR 1中看到的那样,我们有3个不同的行,如果我运行'for',我将删除其中的3个,我只需删除那些有0的行在特定的列中('otc''tm''lex''maint')。
我认为在'for'中移动CSR并且另一个移动'otc'如果我找到的值为零移动到'tm'(在同一行)检查为零,那么要在同一行中“租赁”和“维护”,如果此列中的任何一列不为零,则跳转到下一个CSR。在这个例子中。我们将删除CSR 1,因为所有这些('otc''t'''''maint')都为零,然后跳转到下一个CSR,再次为1,但在这种情况下,我们在'otc'中为零但是'tm'中的1,所以我们必须跳转到下一个CSR再次为1,但是所有列('otc''tm'''租赁''maint')都是零,所以我们删除了行,并继续直到最后一个CSR ......
我认为这可行,但我有一些问题需要实施,或者你们中的任何人都有更好的主意。谢谢,抱歉英文不好
答案 0 :(得分:2)
您还可以提取您感兴趣的四列,并计算每行有多少个零,并为索引创建逻辑向量:
df[(df[['otc', 'tm', 'lease', 'maint']] == 0).sum(axis = 1) < 4]
# csr id ac otc tm lease maint
# 1 1 543 a 0 1 1 0
# 3 2 123 w 1 1 1 1
# 6 4 258 k 1 1 1 1
答案 1 :(得分:1)
试试这个:
In [35]: df.eval('otc == 0 and tm == 0 and lease == 0 and maint == 0')
Out[35]:
0 True
1 False
2 True
3 False
4 True
5 True
6 False
7 True
dtype: bool
In [36]: df[~df.eval('otc == 0 and tm == 0 and lease == 0 and maint == 0')]
Out[36]:
csr id ac otc tm lease maint
1 1 543 a 0 1 1 0
3 2 123 w 1 1 1 1
6 4 258 k 1 1 1 1