1163

私はこれを持っていて、列がないDataFrameレコードのみが必要です:EPSNaN

>>> df
                 STK_ID  EPS  cash
STK_ID RPT_Date                   
601166 20111231  601166  NaN   NaN
600036 20111231  600036  NaN    12
600016 20111231  600016  4.3   NaN
601009 20111231  601009  NaN   NaN
601939 20111231  601939  2.5   NaN
000001 20111231  000001  NaN   NaN

...つまりdf.drop(....)、この結果のデータフレームを取得するようなもの:

                  STK_ID  EPS  cash
STK_ID RPT_Date                   
600016 20111231  600016  4.3   NaN
601939 20111231  601939  2.5   NaN

それ、どうやったら出来るの?

4

14 に答える 14

1224

ドロップしないでください。EPS が NA ではない行を取得してください。

df = df[df['EPS'].notna()]
于 2012-11-16T09:34:38.297 に答える
1109

この疑問は解決済みですが…

...Wouter が元のコメントで提案した解決策も検討してください。などの欠落データを処理する機能dropna()は、pandas に明示的に組み込まれています。手動で行うよりもパフォーマンスが向上する可能性があるだけでなく、これらの関数には便利なさまざまなオプションも用意されています。

In [24]: df = pd.DataFrame(np.random.randn(10,3))

In [25]: df.iloc[::2,0] = np.nan; df.iloc[::4,1] = np.nan; df.iloc[::3,2] = np.nan;

In [26]: df
Out[26]:
          0         1         2
0       NaN       NaN       NaN
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
4       NaN       NaN  0.050742
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
8       NaN       NaN  0.637482
9 -0.310130  0.078891       NaN

In [27]: df.dropna()     #drop all rows that have any NaN values
Out[27]:
          0         1         2
1  2.677677 -1.466923 -0.750366
5 -1.250970  0.030561 -2.678622
7  0.049896 -0.308003  0.823295

In [28]: df.dropna(how='all')     #drop only if ALL columns are NaN
Out[28]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
4       NaN       NaN  0.050742
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
8       NaN       NaN  0.637482
9 -0.310130  0.078891       NaN

In [29]: df.dropna(thresh=2)   #Drop row if it does not have at least two values that are **not** NaN
Out[29]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
5 -1.250970  0.030561 -2.678622
7  0.049896 -0.308003  0.823295
9 -0.310130  0.078891       NaN

In [30]: df.dropna(subset=[1])   #Drop only if NaN in specific column (as asked in the question)
Out[30]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
9 -0.310130  0.078891       NaN

行の代わりに列を削除するなど、他のオプションもあります ( http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.htmlのドキュメントを参照)。

かなり便利!

于 2012-11-17T20:27:33.253 に答える
139

私はこれがすでに答えられていることを知っていますが、Amanからの一般的な説明(これは素晴らしかった)とは対照的に、この特定の質問に対する純粋にパンダの解決策のために、そして他の誰かがこれに遭遇した場合に備えて:

import pandas as pd
df = df[pd.notnull(df['EPS'])]
于 2014-04-23T05:37:45.533 に答える
26

データフレーム メソッドnotnullまたはisnullの逆、またはnumpy.isnanを使用できます。

In [332]: df[df.EPS.notnull()]
Out[332]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN


In [334]: df[~df.EPS.isnull()]
Out[334]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN


In [347]: df[~np.isnan(df.EPS)]
Out[347]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN
于 2015-12-04T07:01:56.243 に答える
2

「&」を使用して追加の条件を追加できます。

df = df[(df.EPS > 2.0) & (df.EPS <4.0)]

ステートメントを評価するとき、pandas には括弧が必要であることに注意してください。

于 2016-03-15T15:33:31.850 に答える
2

多数の列を持つデータセットでは、null 値を含む列と含まない列の数を確認することをお勧めします。

print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))

print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))

print("Total no. of columns in the dataframe")
print(len(df.columns))

たとえば、私のデータフレームには 82 列が含まれており、そのうち 19 列には少なくとも 1 つの null 値が含まれていました。

さらに、ヌル値が多いかどうかに応じて、列と行を自動的に削除することもできます
。これをインテリジェントに行うコードは次のとおりです。

df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)

注:上記のコードは、null 値をすべて削除します。null 値が必要な場合は、事前に処理してください。

于 2019-12-14T04:23:27.593 に答える