1

パンダで作業しているときに、欠損値の非常に奇妙な動作が発生しています。それは私を驚かせます。

次の点に注意してください。

import pandas as pd
import numpy as np
from numpy import nan as NA
from pandas import DataFame

In [1]: L1 = [NA, NA]
In [2]: L1
Out[2]: [nan, nan]
In [3]: set(L1)
Out[3]: {nan}

ここまでは順調で、予想通り、リスト L1 のセットには単一の NA 値が含まれています。しかし今、まったく同じことをデータフレームシリーズから引き出されたリストに基づいて行うとどうなるかについて、私は完全に困惑しています

In [4]: EG = DataFrame(np.random.rand(10), columns = ['Data'])
In [5]: EG['Data'][5:7] = NA
In [6]: L2 = list(EG['Data'][5:7])
In [7]: L2
Out[8]: [nan, nan]
In [9]: set(L2)
Out[9]: {nan, nan}

ここで何が起きてるの?基になっているリストがまったく同じに見えるのに、セットが異なるのはなぜですか?

おそらくタイプが異なると考えて、少し掘り下げました(NA値がまったく同じように見える方法で作成されたことを考えると、これは驚くべきことです)。以下を参照してください。

In [10]: type(L1[0])
Out[10]: float
In [11]: type(L1[1])
Out[11]: float
In [12]: type(L2[0])
Out[12]: numpy.float64
In [13]: type(L2[1])
Out[13]: numpy.float64

明らかに型が異なっており、すでに頭がおかしくなっていますが、L2 の各要素を L1 と同じように float に変換すると、奇妙なセットの動作が消えるはずです。

In [14]: L3 = [float(elem) for elem in L2]
In [15]: L3
Out[15]: [nan, nan]
In [16]: type(L3[0])
Out[16]: float
In [17]: type(L3[1])
Out[17]: float 
In [18]: set(L3)
Out[18]: {nan, nan}

L3 の要素の型が L1 の要素の型とまったく同じ場合でも、問題は解決しません。

誰か助けてくれませんか?

groupby を使用してデータを集計するときは、set(L) の通常の機能に依存しています。私はこの問題に気づき、気が狂いそうになりました。回避策について知りたいのですが、ここで何が起こっているのかもっと疑問に思っています....

助けてください...

編集: ユーザーのコメントに応えて、実際にデータを集計しようとしているコードを投稿します。これが問題の次元を変えるかどうかはわかりませんが、なぜそれがとてもイライラするのかを理解するのに役立つかもしれません:

def NoActionRequired(x):
""" This function is used to aggregate the data that is believed to be equal within multi line/day groups. It puts the data 
    into a list and then if that list forms a set of length 1 (which it must if the data are in fact equal) then the single
    value contained in the set is returned, otherwise the list is returned. This allows for the fact that we may be wrong about
    the equality of the data, and it is something that can be tested after aggreagation."""

    L = list(x)
    S = set(L)
    if len(S) == 1:
        return S.pop()
    else:
        return L

DFGrouped['Data'].agg(NoActionRequired)

グループ内のすべてのデータが同一で​​ある場合は単一の値が返され、そうでない場合はデータのリストが返されるという考え方です。

4

1 に答える 1

1

私が今見ている唯一の説明はNA、最初のリストのすべてが同じオブジェクトであるということです:

>>> L1 = [NA, NA]
>>> L1
[nan, nan]
>>> L1[0] is L1[1]
True

2 番目のリストのオブジェクトは別のオブジェクトですが、次のようになります。

>>> L2 = list(pd.Series([NA, NA]))
>>> L2
[nan, nan]
>>> L2[0] is L2[1]
False

関数については、セットの代わりにpandas.Series.unique()を使用することをお勧めします。

def NoActionRequired(x):
    # ...    
    S = x.unique()
    if len(S) == 1:
        return S[0]
    else:
        return list(x)

unique()うまくいくように見えNaNます:

>>> pd.Series([NA, NA]).unique()
array([ nan])

NA がリストにあるかどうかを編集して確認するには、 np.isnan() 関数を使用できます。

>>> L = [NA, 1, 2]
>>> np.isnan(L)
array([ True, False, False], dtype=bool)
于 2013-11-05T07:32:09.373 に答える