用pandas去除数据框中的特定行

我需要从你们所有人的帮助我正在从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个,我只需要删除那些在特定列('otc''tm''lease''maint')。

我认为,如果我发现的价值为零的移动到'tm'(在同一行)检查零,那么'租赁'是为了在CSR中移动,另一个是在'otc' '和'maint',如果这些列中的任何一个不是零,则跳转到下一个CSR。 在这个例子中。 我们将删除CSR 1,因为它们都是零('OTT''lease''maint'),然后再跳到下一个CSR,但是在这种情况下,我们在'otc'中有零,但是1'tm',所以我们不得不跳转到下一个CSR再次是1,但是所有的列('OTT''tm''lease''maint')都是零,所以我们删除该行,并继续直到最后的CSR …

我认为这可以工作,但我有一些问题来实现,或者也许你们有更好的主意。 谢谢你,对不起英语

您还可以提取您感兴趣的四列,并计算每行有多less个零,并为索引创build逻辑向量:

 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 

尝试这个:

 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