使用pandas

时间:2016-09-07 20:33:45

标签: python excel pandas dataframe filter

我需要你们所有人的帮助 我正在使用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 ......

我认为这可行,但我有一些问题需要实施,或者你们中的任何人都有更好的主意。谢谢,抱歉英文不好

2 个答案:

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