パンダで作業しているときに、欠損値の非常に奇妙な動作が発生しています。それは私を驚かせます。
次の点に注意してください。
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)
グループ内のすべてのデータが同一である場合は単一の値が返され、そうでない場合はデータのリストが返されるという考え方です。