web-dev-qa-db-ja.com

Pandas)によって作成されたデータフレームの列の平均を計算するときに「スキップNA」を指定する

いくつかのRビネットからの外出を複製することにより、Pandasパッケージを学習しています。ここで、例としてRのdplyrパッケージを使用しています。

http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

Rスクリプト

planes <- group_by(hflights_df, TailNum)
delay <- summarise(planes,
  count = n(),
  dist = mean(Distance, na.rm = TRUE))
delay <- filter(delay, count > 20, dist < 2000)

Pythonスクリプト

planes = hflights.groupby('TailNum')
planes['Distance'].agg({'count' : 'count',
                        'dist' : 'mean'})

python NAをスキップする必要があることを明示的に述べるにはどうすればよいですか?

7
lokheart

あなたはそれをしないので、それはトリックの質問です。 Pandasは自動的にNaNの数値を集計関数から除外します。私のdfについて考えてみましょう。

_    b   c   d  e
a               
2   2   6   1  3
2   4   8 NaN  7
2   4   4   6  3
3   5 NaN   2  6
4 NaN NaN   4  1
5   6   2   1  8
7   3   2   4  7
9   6   1 NaN  1
9 NaN NaN   9  3
9   3   4   6  1
_

内部のcount()関数はNaN値を無視し、mean()も無視します。 NaNを取得する唯一のポイントは、唯一の値がNaNの場合です。次に、空集合の平均値を取得します。これはNaNであることがわかります。

_In[335]: df.groupby('a').mean()
Out[333]: 
          b    c    d         e
a                              
2  3.333333  6.0  3.5  4.333333
3  5.000000  NaN  2.0  6.000000
4       NaN  NaN  4.0  1.000000
5  6.000000  2.0  1.0  8.000000
7  3.000000  2.0  4.0  7.000000
9  4.500000  2.5  7.5  1.666667
_

集計関数は同じように機能します。

_In[340]: df.groupby('a')['b'].agg({'foo': np.mean})
Out[338]: 
        foo
a          
2  3.333333
3  5.000000
4       NaN
5  6.000000
7  3.000000
9  4.500000
_

補遺:標準 dataframe.mean API で、NaN値の包含を制御できることに注意してください。ここでデフォルトはexcludeです。

9
FooBar

Foob​​arが言ったことは、デフォルトでどのように実装されたかに関しては真実ですが、skipnaを指定する非常に簡単な方法があります。これはそれ自体を語る例です:

def custom_mean(df):
    return df.mean(skipna=False)

group.agg({"your_col_name_to_be_aggregated":custom_mean})

それでおしまい!独自の集計を好きなようにカスタマイズできます。これはかなり効率的だと思いますが、掘り下げませんでした。

それも議論されました ここ 、しかし私は良いニュースを広めるのを手伝うと思いました!回答は公式で見つかりました doc

1
c-a