【问题标题】:remove specific rows in dataframe with pandas使用熊猫删除数据框中的特定行
【发布时间】:2017-01-15 15:43:43
【问题描述】:

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

基本上这会将特定列中带有零的行的 CSR 编号保存在 df1 中,就像这样

csr
 1
 1
 2 
 3
 4

所以我认为我这样做并解决了问题。

for n1 in df1:
    df = df[df.CSR != n1]

但是这里的问题是,正如您在 CSR 1 中看到的那样,我们有 3 个不同的行,如果我运行“for”,我将删除其中的 3 个,我只需要删除那些有零的行在特定列中('otc' 'tm' 'lease' 'maint')。

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

我认为这可行,但我在实施时遇到了一些问题,或者你们中的任何人都有更好的想法。感谢和抱歉英语不好

【问题讨论】:

    标签: python excel pandas dataframe filter


    【解决方案1】:

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

    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
    

    【讨论】:

    • 我会这样做:df[~(df[['otc','tm','lease','maint']] == 0).all(1)]df[(df[['otc','tm','lease','maint']] != 0).any(1)]
    • @MaxU 即将添加第二个选项。是的,我想这是一个更好的选择。
    【解决方案2】:

    试试这个:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 2023-03-16
      • 2019-11-12
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2018-02-02
      相关资源
      最近更新 更多