これは、anaconda2バージョンとanaconda3バージョンの本当に奇妙な違いが現れる短いPythonコードです。
import pandas as pd
def div(x):
to_sum = x['a']
to_sum /= 2
def mul(x):
to_sum = x['a']
to_sum *= 2
a = pd.DataFrame(data=[[10.0, 20.0]], columns=['a', 'b'])
print('init:')
print(a)
div(a)
print('after div:')
print(a)
mul(a)
print('after mul:')
print(a)
私がこのようにそれを実行するとき:
echo "python3:" && \
~/work/Programs/Anaconda/anaconda3/bin/python3 tmp.py && \
echo && \
echo "python2:" && \
~/work/Programs/Anaconda/anaconda2/bin/python2 tmp.py
バージョンが異なれば、主に異なる結果が得られます。
python3:
init:
a b
0 10.0 20.0
after div:
a b
0 5.0 20.0
after mul:
a b
0 10.0 20.0
python2:
init:
a b
0 10.0 20.0
after div:
a b
0 10.0 20.0
after mul:
a b
0 20.0 20.0
私がPythonを理解している時点では、正しい動作はpython3runによって示されています。演算子/ =がpython2の関数引数に影響を与えないのはなぜですか?さらに、なぜ演算子* =がそれに影響するのですか??!
私はアナコンダの公式ウェブサイトからPythonとパンダを使用しています。バージョンは次のとおりです:(python 3.6.0 with pandas 0.19.2)および(python 2.7.13 with pandas 0.20.3)
編集1:整数(つまりa = pd.DataFrame(data=[[10, 20]], columns=['a', 'b'], dtype='int')
)に対してこれを試してみると、次のようになります。
python3:
init:
a b
0 10 20
after div:
a b
0 5.0 20
after mul:
a b
0 10.0 20
python2:
init:
a b
0 10 20
after div:
a b
0 10 20
after mul:
a b
0 20 20
これはパンダの12962号でした。のエラーpandas.core.ops
により__idiv__
、コピーを返す代わりにシリーズを適切に更新する処理が欠落していました。パンダを少なくとも0.21に更新すると、問題が修正されるはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加