Pandas: 異なるインデックスを持つDataFrameにシリーズを追加すると、シリーズはすべてのNaNに変換されます

作成日 2011年12月06日  ·  9コメント  ·  ソース: pandas-dev/pandas

適例:

>>> df
               RP/Rsum  P.value
ID                             
A_23_P42353    17.8     0      
A_23_P369994   15.91    0      
A_33_P3262440  436.7    0.0005 
A_32_P199429   18.97    0      
A_23_P256724   22.24    0      
A_33_P3394689  24.24    0      
A_33_P3403117  27.14    0      
A_24_P252364   28.56    0      
A_23_P99515    31.82    0      
A_24_P261750   31.46    0 

>>> df.dtypes
RP/Rsum    float64
P.value    float64

>>> ids = pandas.Series(['51513', '9201', np.nan, np.nan, '8794', '6530', '7025', '4897', '84935', '11081'])
>>> df["test"] = ids
>>> df
               RP/Rsum  P.value  test
ID                                   
A_23_P42353    17.8     0        NaN 
A_23_P369994   15.91    0        NaN 
A_33_P3262440  436.7    0.0005   NaN 
A_32_P199429   18.97    0        NaN 
A_23_P256724   22.24    0        NaN 
A_33_P3394689  24.24    0        NaN 
A_33_P3403117  27.14    0        NaN 
A_24_P252364   28.56    0        NaN 
A_23_P99515    31.82    0        NaN 
A_24_P261750   31.46    0        NaN 
>>> df.dtypes
RP/Rsum    float64
P.value    float64
test       object

これは、floatオブジェクトなどでも発生します。 トリガーが何であるかわかりません。

最も参考になるコメント

シリーズには、指定しない場合に暗黙の0、...、N-1インデックスが与えられます。したがって、これはまさに私が期待する動作です。 dataが生のndarrayまたはリストである場合、これは発生しません。 だからあなたがするときの事実:

df[col] = series

そしてそれはシリーズをdfのインデックスに正確に適合させます、それは機能でありバグではありません:)だから

df['test'] = ids.values

あなたの例ではうまくいくでしょう

全てのコメント9件

今朝も見つけたこの問題に関連しているのだろうか:

>>> df = pandas.DataFrame(index=[1,2,3,4])
>>> df["test"] = pandas.Series(["B", "fdf", "344", np.nan])
>>> df["test2"] = ["B", "fdf", "344", np.nan]
>>> df   test  test2
1  fdf   B    
2  344   fdf  
3  NaN   344  
4  NaN   nan  

私にはある種のオフバイワンエラーのように見えます。

さらに掘り下げると、アイテムを原因として設定するときにSeries.reindexが呼び出されます。

>>> data 
0    B
1    fdf
2    344
3    NaN

>>>  df.index = ["A", "B", "C", "D"]
>>> data.reindex(df.index).values
array([nan, nan, nan, nan], dtype=object)

さらに掘り下げると、呼び出されるインデックス属性のreindexが発生し、奇妙な結果が得られます。

>>> data.index.reindex(df.index)
(Index([A, B, C, D], dtype=object), array([-1, -1, -1, -1], dtype=int32))

これらの-1はNaNに変換されます。

より正確な説明でバグタイトルを更新しました。

シリーズには、指定しない場合に暗黙の0、...、N-1インデックスが与えられます。したがって、これはまさに私が期待する動作です。 dataが生のndarrayまたはリストである場合、これは発生しません。 だからあなたがするときの事実:

df[col] = series

そしてそれはシリーズをdfのインデックスに正確に適合させます、それは機能でありバグではありません:)だから

df['test'] = ids.values

あなたの例ではうまくいくでしょう

その場合、まだ文書化されていない場合は、おそらくどこかに文書化する必要があります。 それまでの間、私はあなたが提案したように私自身のコードを調整します、ありがとう。

http://pandas.sourceforge.net/dsintro.html#column -selection-addition-deletion

When inserting a Series that does not have the same index as the DataFrame, it will be conformed to the DataFrame’s index:

In [180]: df['one_trunc'] = df['one'][:2]

In [181]: df
Out[181]: 
   one  flag   foo  one_trunc
a  1    False  bar  1        
b  2    False  bar  2        
c  3    True   bar  NaN      
d  NaN  False  bar  NaN      

You can insert raw ndarrays but their length must match the length of the DataFrame’s index.

DataFrameと同じインデックスを持たないシリーズを挿入すると、DataFrameのインデックスに準拠するという事実の背後にある考え方は何ですか?

シリーズからDataFrameを作成する場合、結果のインデックスはすべての個々のシリーズインデックスをカバーします。 では、df ['new_column'] = seriesの場合、なぜこのアイデアが使用されないのでしょうか。
それで、データを追加しようとしますが、DataFrameインデックスと一致しないすべての値を無視しますか?
_index extension_が存在する場合、インデックスを拡張したくない場合は常にdf ['new_column'] = series.reindex(df.index)を実行できますか(現在の動作)?

In [256]: df = pandas.DataFrame({'A': pandas.Series(['foo', 'bar'], index=['a', 'b']),
   .....:                        'B': pandas.Series([10, 20], index=['b', 'c'])})

In [257]: df
Out[257]:
   A    B
a  foo  NaN
b  bar  10.000
c  NaN  20.000

In [258]: df['C'] = pandas.Series(range(3), index=['a', 'c', 'd'])

In [259]: df
Out[259]:
   A    B       C
a  foo  NaN     0.000
b  bar  10.000  NaN
c  NaN  20.000  1.000

上記の例では、DataFrameに行 'd'が必要です。

さて、基本的な考え方は、DataFrameが「シリーズの固定長のdictのようなコンテナ」であるということだと思います。 明示的なインデックスなしでSeriesのdictを使用してDataFrameを構築する場合、それらすべての結合以外に明らかなインデックスはありません。

インデックスを暗黙的に拡張するための議論を見ることができますが、どちらの方法でもトレードオフがあります

このページは役に立ちましたか?
0 / 5 - 0 評価