pandas 如果除一列之外的所有列都为空,如何删除整行?

pcrecxhr  于 2022-12-02  发布在  其他
关注(0)|答案(6)|浏览(175)

如果除了一列之外的所有列都为空,我希望删除整行。

df = pd.DataFrame({"col1": ["s1", "s2", "s3", "s4", "s5", "s6"],
                   "col2": [41, np.nan, np.nan, np.nan, np.nan, 61],
                   "col3": [24, 51, np.nan, np.nan, np.nan, 84],
                   "col4": [53, 64, 81, np.nan, np.nan, np.nan],
                   "col5": [43, 83, 47, 12, np.nan, 19]})

它看起来像这样

col1   col2   col3   col4   col5
0   s1     41     24     53     43
1   s2     NaN    51     64     83
2   s3     NaN    NaN    81     47
3   s4     NaN    NaN    NaN    12
4   s5     NaN    NaN    NaN    NaN
5   s6     61     84     NaN    19

在此示例中,所需结果为

col1   col2   col3   col4   col5
0   s1     41     24     53     43
1   s2     NaN    51     64     83
2   s3     NaN    NaN    81     47
3   s4     NaN    NaN    NaN    12
4   s6     61     84     NaN    19

这意味着我想删除最后一行。我最初尝试使用df.dropna(how="all"),但它不起作用,因为最后一行不是完全空的(col1中的s5)。
我该如何解决这个问题?

3mpgtkmj

3mpgtkmj1#

使用thresh参数:

N = 1
df.dropna(thresh=N+1)

或者,如果您希望精确匹配N NA(不多不少):

N = 1
out = df[df.isna().sum(axis=1).ne(df.shape[1]-N)]

输出量:

col1  col2  col3  col4  col5
0   s1  41.0  24.0  53.0  43.0
1   s2   NaN  51.0  64.0  83.0
2   s3   NaN   NaN  81.0  47.0
3   s4   NaN   NaN   NaN  12.0
0lvr5msh

0lvr5msh2#

df[df.iloc[:, 1:].notnull().any(axis=1)]
0wi1tuuw

0wi1tuuw3#

您应该在dropna中使用threshold。

df = df.dropna(axis=0, thresh=2)
7ivaypg9

7ivaypg94#

您也可以尝试使用此方法来检查元素是否为NaN
np.isnan()
以下是官方文档以获取更多信息。https://numpy.org/doc/stable/user/misc.html

rsaldnfx

rsaldnfx5#

作为给定答案的替代方法,如果您希望使用.dropna(),可以使用以下命令将col1设置为索引:

df = df.set_index("col1")

这样df.dropna(how='all')就像一个符咒。如果你不再需要它作为索引,你可以通过df['col1'] = df.index取回你的列,并重置索引df.reset_index(drop=True)
col1将出现在col5之后,您可以使用以下命令将其重新排列:

cols = df.columns.tolist()
cols = cols[-1:] + cols[:-1]
df[cols]
2g32fytz

2g32fytz6#

import numpy as np
import pandas as pd 

df = pd.DataFrame({"x1": [np.nan, np.nan], "x2": [1, np.nan]})
print(df.head())

for idx, row in df.iterrows():
    if np.isnan(row).all():
        df = df.drop(idx)

print(df.head())

在编辑中添加:
只需从行计数中删除不相关的列。

import numpy as np
import pandas as pd 

df = pd.DataFrame({"name": ["keep", "remove"], "x1": [np.nan, np.nan], "x2": [1, np.nan]})
print("ORG")
print(df.head())

for idx, row in df.iterrows():
    if np.isnan(row[1:].astype(float)).all():
        df = df.drop(idx)

print("OUT")
print(df.head())

相关问题