適例:
>>> 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オブジェクトなどでも発生します。 トリガーが何であるかわかりません。
今朝も見つけたこの問題に関連しているのだろうか:
>>> 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、...、N-1インデックスが与えられます。したがって、これはまさに私が期待する動作です。
data
が生のndarrayまたはリストである場合、これは発生しません。 だからあなたがするときの事実:df[col] = series
そしてそれはシリーズを
df
のインデックスに正確に適合させます、それは機能でありバグではありません:)だからdf['test'] = ids.values
あなたの例ではうまくいくでしょう