【问题标题】:Delete rows in dataframe based on column values根据列值删除数据框中的行
【发布时间】:2016-04-25 19:00:08
【问题描述】:

我需要删除 C 列中所有具有空值的行。代码如下:

infile="C:\****"

df=pd.read_csv(infile)    

A   B   C   D
1   1   NaN 3
2   3   7   NaN
4   5   NaN 8
5   NaN 4   9
NaN 1   2   NaN

我尝试了两种基本方法。

方法一: 来源:How to drop rows of Pandas DataFrame whose value in certain columns is NaN

df.dropna()

结果是一个空数据框,这是有道理的,因为每一行都有一个 NaN 值。

df.dropna(subset=[3])

对于这种方法,我尝试使用列索引号和列名来处理子集值。数据框仍然是空的。

方法二: 来源:Deleting DataFrame row in Pandas based on column value

df = df[df.C.notnull()]

仍然导致空数据框!

我做错了什么?

【问题讨论】:

  • df.dropna(subset=['C'])
  • 并且第二种方法不返回空数据框。会不会是您第一次尝试清空数据框的情况?
  • 是的,方法2应该也可以
  • 我很肯定数据框已满,因为我之前已经直接在线打印了它。 @MaxU df.dropna(subset=["C"]) 打印一个完整的数据帧,包括空值!太令人沮丧了。

标签: python pandas dataframe


【解决方案1】:
df = pd.DataFrame([[1,1,np.nan,3],[2,3,7,np.nan],[4,5,np.nan,8],[5,np.nan,4,9],[np.nan,1,2,np.nan]], columns = ['A','B','C','D'])
df = df[df['C'].notnull()]
df

【讨论】:

  • @EdChum 他不喜欢上面的 notnull(),所以我给了他一些变化 :)
  • 在我看来,由于第一次不正确的操作,OP 得到了一个空数据框
  • 虽然此代码可以回答问题,但提供有关它为什么和/或如何回答问题的额外上下文将显着提高其长期价值。请edit你的答案添加一些解释。
【解决方案2】:

这只是证明您的 method 2 工作正常(至少在 pandas 0.18.0 中):

In [100]: df
Out[100]:
     A    B    C    D
0  1.0  1.0  NaN  3.0
1  2.0  3.0  7.0  NaN
2  4.0  5.0  NaN  8.0
3  5.0  NaN  4.0  9.0
4  NaN  1.0  2.0  NaN

In [101]: df.dropna(subset=['C'])
Out[101]:
     A    B    C    D
1  2.0  3.0  7.0  NaN
3  5.0  NaN  4.0  9.0
4  NaN  1.0  2.0  NaN

In [102]: df[df.C.notnull()]
Out[102]:
     A    B    C    D
1  2.0  3.0  7.0  NaN
3  5.0  NaN  4.0  9.0
4  NaN  1.0  2.0  NaN

In [103]: df = df[df.C.notnull()]

In [104]: df
Out[104]:
     A    B    C    D
1  2.0  3.0  7.0  NaN
3  5.0  NaN  4.0  9.0
4  NaN  1.0  2.0  NaN

【讨论】:

  • 好的,所以差异必须与我的数据集有关。或者是否有可能我的 NaN 值实际上并未被识别为 null?它们是使用 pandas.merge 生成的。
  • @geolish,只需打印 df.isnull() - 您应该会在包含 NaN 的单元格中看到 True
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多