pandas 删除从非第一列开始的空行

qij5mzcb  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(147)

在pandas中,我有一个df,看起来像这样:

A      B    C   D
0  a      b     
1  aaa    bbb  cc
2  aa     b    
3  a      b        dd
4              c

我想删除所有的空行,但从“C”单元格开始。所以在上面的例子中,我想只删除0和2行。我不在乎前一列是否为空。我感兴趣的是只删除“C”列中的空行并向前移动。我如何才能做到这一点?

nszi6y05

nszi6y051#

Pandas有一个函数drop_na,您可以给予它的一个子集(在本例中为列C和D)https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html
我会这样做:

df = pd.DataFrame({"A":["a","aaa","aa","a",None],"B":["b","bbb","b","b", None],"C":[None, "cc", None, None, "c"], "D": [None, None, None, "dd", None]}) # create the test dataframe

df = df.dropna(subset=["C","D"], how="all") # drop rows from the C and D subset if all are null

正如注解所建议的那样,如果您想将其作为一个函数

def drop_unwanted(exclude_columns,df): 
    df = df.dropna(subset=[x for x in df.columns if x not in exclude_columns], how="all") 
    return df

并将您要排除的列指定给函数!

wz3gfoph

wz3gfoph2#

IIUC,这里有一个带有 boolean indexing 的选项:

out = df[~df.loc[:, "C":].isna().all(axis=1)]

输出:

print(out)

     A    B    C    D
1  aaa  bbb   cc  NaN
3    a    b  NaN   dd
4  NaN  NaN    c  NaN
6ie5vjzr

6ie5vjzr3#

你可以使用loc对 Dataframe 进行切片,并使用布尔掩码来选择正确的行:

filtered_df = df[~df.loc[:, 'C':].isna().all(axis=1)]
print(filtered_df)

# Output
      A     B     C     D
1   aaa   bbb    cc  None
3     a     b  None    dd
4  None  None     c  None

也可以使用drop

filtered_df = df.drop(df.loc[:, 'C':].isna().all(axis=1).loc[lambda x: x].index)
print(filtered_df)

# Output
      A     B     C     D
1   aaa   bbb    cc  None
3     a     b  None    dd
4  None  None     c  None

相关问题