簡體   English   中英

Pandas:如果超過一半是 NaN,則刪除行、列

[英]Pandas: Drop Rows, Columns If More Than Half Are NaN

我有一個名為df的 Pandas DataFrame,有 1,460 行和 81 列。 我想刪除至少一半條目是 NaN 的所有列,並對行做類似的事情。

從 Pandas 文檔中,我嘗試了以下操作:

train_df.shape //(1460, 81)
train_df.dropna(thresh=len(train_df)/2, axis=1, inplace=True)
train_df.shape //(1460, 77)

這是正確的做法嗎? 它似乎刪除了 4 列,但我很驚訝。 我原以為len(train_df)會得到我的行數,所以我將錯誤的值傳遞給了thresh ...?

我將如何對行做同樣的事情(刪除至少有一半列是 NaN 的行)?

謝謝!

使用countloc count(axis=)忽略NaN進行計數。

In [4135]: df.loc[df.count(1) > df.shape[1]/2, df.count(0) > df.shape[0]/2]
Out[4135]:
          0
0  0.382991
1  0.428040
7  0.441113

詳情

In [4136]: df
Out[4136]:
          0         1         2         3
0  0.382991  0.658090  0.881214  0.572673
1  0.428040  0.258378  0.865269  0.173278
2  0.579953       NaN       NaN       NaN
3  0.117927       NaN       NaN       NaN
4  0.597632       NaN       NaN       NaN
5  0.547839       NaN       NaN       NaN
6  0.998631       NaN       NaN       NaN
7  0.441113  0.527205  0.779821  0.251350

In [4137]: df.count(1) > df.shape[1]/2
Out[4137]:
0     True
1     True
2    False
3    False
4    False
5    False
6    False
7     True
dtype: bool

In [4138]: df.count(0) < df.shape[0]/2
Out[4138]:
0    False
1     True
2     True
3     True
dtype: bool

我猜你做對了,但忘了添加 .index。 該行應如下所示:

train_df.dropna(thresh=len(train_df.index)/2, axis=1, inplace=True)

希望有幫助。

設置

np.random.seed([3,14159])
df = pd.DataFrame(np.random.choice([1, np.nan], size=(10, 10)))

df

     0    1    2    3    4    5    6    7    8    9
0  1.0  1.0  NaN  NaN  NaN  1.0  1.0  NaN  1.0  NaN
1  NaN  1.0  1.0  1.0  1.0  1.0  1.0  1.0  NaN  1.0
2  NaN  1.0  1.0  NaN  NaN  NaN  NaN  1.0  1.0  1.0
3  1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  NaN
4  1.0  1.0  1.0  1.0  1.0  1.0  NaN  NaN  1.0  NaN
5  1.0  NaN  NaN  1.0  NaN  NaN  1.0  NaN  NaN  1.0
6  NaN  NaN  1.0  NaN  NaN  1.0  1.0  NaN  NaN  1.0
7  NaN  NaN  NaN  1.0  NaN  1.0  NaN  1.0  NaN  NaN
8  1.0  1.0  1.0  NaN  1.0  NaN  1.0  NaN  NaN  1.0
9  NaN  NaN  NaN  1.0  1.0  1.0  1.0  1.0  1.0  1.0

解決方案1
這假設您在刪除行或列之前對行和列進行計算。

n = df.notnull()

df.loc[n.mean(1) > .5, n.mean() > .5]

     5    6    9
1  1.0  1.0  1.0
4  1.0  NaN  NaN
8  NaN  1.0  1.0
9  1.0  1.0  1.0

解決方案2
類似的概念,但使用numpy工具。

v = np.isnan(df.values)

r = np.count_nonzero(v, 1) < v.shape[1] // 2
c = np.count_nonzero(v, 0) < v.shape[0] // 2
df.loc[r, c]

     5    6    9
1  1.0  1.0  1.0
4  1.0  NaN  NaN
8  NaN  1.0  1.0
9  1.0  1.0  1.0

試試這個代碼,它會做!

df.dropna(thresh = df.shape[1]/3, axis = 0, inplace = True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM