从熊猫df中删除行

我正在尝试从中删除所有rows内容pandas df。具体来说,当row下面X的内容Col A为空时。因此,如果inrow底下为空,我想删除所有这些行,直到有底下的值XCol AstringX


import pandas as pd


d = ({

    'A' : ['X','','','X','Foo','','X','Fou','','X','Bar'],           

    'B' : ['Val',1,3,'Val',1,3,'Val',1,3,'Val',1],

    'C' : ['Val',2,4,'Val',2,4,'Val',2,4,'Val',2],

    })


df = pd.DataFrame(data=d)

输出:


      A    B    C

0     X  Val  Val

1          1    2

2          3    4

3     X  Val  Val

4   Foo    1    2

5          3    4

6     X  Val  Val

7   Fou    1    2

8          3    4

9     X  Val  Val

10  Bar    1    2

我试过了:


df = df[~(df['A'] == 'X').shift().fillna(False)]

但这会删除X后面的所有内容。我只希望在X下的下一行为空的情况下将其删除。


故意的:


     A    B    C

0    X  Val  Val

1  Foo    1    2

2         3    4

3    X  Val  Val

4  Fou    1    2

5         4    4

6    X  Val  Val

7  Bar    1    2


GCT1015
浏览 190回答 3
3回答

慕娘9325324

用:m1 = df['A'] == 'X'g =  m1.cumsum()m = (df['A'] == '') | m1df = df[~m.groupby(g).transform('all')]print (df)      A    B    C3     X  Val  Val4   Foo    1    25          3    46     X  Val  Val7   Fou    1    28          3    49     X  Val  Val10  Bar    1    2详细资料:m1 = df['A'] == 'X'g =  m1.cumsum()m = (df['A'] == '') | m1print (pd.concat([df,                  df['A'] == 'X',                  m1.cumsum(),                  (df['A'] == ''),                   m,                  m.groupby(g).transform('all'),                  ~m.groupby(g).transform('all')], axis=1,       keys=['orig','==X','g','==space','m', 'all', 'inverted all']))   orig              ==X  g ==space      m    all inverted all      A    B    C      A  A       A      A      A            A0     X  Val  Val   True  1   False   True   True        False1          1    2  False  1    True   True   True        False2          3    4  False  1    True   True   True        False3     X  Val  Val   True  2   False   True  False         True4   Foo    1    2  False  2   False  False  False         True5          3    4  False  2    True   True  False         True6     X  Val  Val   True  3   False   True  False         True7   Fou    1    2  False  3   False  False  False         True8          3    4  False  3    True   True  False         True9     X  Val  Val   True  4   False   True  False         True10  Bar    1    2  False  4   False  False  False         True说明:比较依据X并为组创建累积总和,起始X于g链2布尔型面罩-比较X并留空mgroupby对于transform和仅用于组的DataFrameGroupBy.allreturn TruesTrue最后反转并过滤 boolean indexing

三国纷争

这是您的解决方案:(df['A'] == 'X').shift()0       NaN1      True2     False3     False4      True5     False6     False7      True8     False9     False10     TrueName: A, dtype: objectIn [15]:(df['A'] == '')Out[15]:0     False1      True2      True3     False4     False5      True6     False7     False8      True9     False10    FalseName: A, dtype: boolIn [14]:((df['A'] == '') & (df['A'] == 'X').shift())Out[14]:0     False1      True2     False3     False4     False5     False6     False7     False8     False9     False10    FalseName: A, dtype: bool结果是:df[~((df['A'] == '') & (df['A'] == 'X').shift())]Out[16]:A   B   C0   X   Val Val2       3   43   X   Val Val4   Foo 1   25       3   46   X   Val Val7   Fou 1   28       3   49   X   Val Val10  Bar 1   2编辑:如果需要,您可以在while循环中进行。old_size_df = df.size new_size_df = 0while old_size_df != new_size_df:    old_size_df = df.size    df = df[~((df['A'] == '') & (df['A'] == 'X').shift())]    new_size_df = df.size    A   B   C0   X   Val Val3   X   Val Val4   Foo 1   25       3   46   X   Val Val7   Fou 1   28       3   49   X   Val Val10  Bar 1   2

慕的地8271018

这是具有自定义套用功能的解决方案:d = ({    'A' : ['X','','','X','Foo','','X','Fou','','X','Bar'],               'B' : ['Val',1,3,'Val',1,3,'Val',1,3,'Val',1],    'C' : ['Val',2,4,'Val',2,4,'Val',2,4,'Val',2],})df = pd.DataFrame(data=d)is_x = Falsedef fill_empty_a(row):    global is_x    if row['A'] == '' and is_x:            row['A'] = None    else:            is_x = row['A'] == 'X'    return row(df.apply(fill_empty_a, axis=1)   .dropna()   .reset_index(drop=True))#      A    B    C# 0    X  Val  Val# 1    X  Val  Val# 2  Foo    1    2# 3         3    4# 4    X  Val  Val# 5  Fou    1    2# 6         3    4# 7    X  Val  Val# 8  Bar    1    2
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python