通常であれば
df['D'] = df['B'] / df['C']
の処理はは全く問題はありませんし、警告も出ないかと思います。
Python
1import pandas as pd
2
3df = pd.DataFrame([['2015-01',1,2],
4 ['2015-02',2,2],
5 ['2015-03',3,4]],
6 columns=['A','B','C'])
7
8df['D'] = df['B'] / df['C']
9print(df)
10# A B C D
11# 0 2015-01 1 2 0.50
12# 1 2015-02 2 2 1.00
13# 2 2015-03 3 4 0.75
今回この警告がでているのであれば、このdf
自体が、他のDataframe の View (Sliceした結果)ということはないでしょうか?
それだったら、この警告がでるのも納得です
Python
1import pandas as pd
2df_org = pd.DataFrame([['2015-01',1,2],
3 ['2015-02',2,2],
4 ['2015-03',3,4],
5 ['2015-04',4,0]],
6 columns=['A','B','C'])
7
8df = df_org[df_org['C'] > 0]
9
10df['D2'] = df['B'] / df['C']
11# A value is trying to be set on a copy of a slice from a DataFrame.
12# Try using .loc[row_indexer,col_indexer] = value instead
もしこれが原因であれば、回避方法としてはView自体を書き換えるのではなく、元のDataFrameに対しての書き換えを行うと良いかと思います。
Python
1df_org.loc[df_org['C'] > 0, 'D'] = df['B'] / df['C']
2print(df_org)
3# A B C D
4# 0 2015-01 1 2 0.50
5# 1 2015-02 2 2 1.00
6# 2 2015-03 3 4 0.75
7# 3 2015-04 4 0 NaN
また、もし元のDataFrameに結果を反映する必要がないのであれば、ViewではなくCopy()
したDataFrameに対して処理を行うとよいでしょう。
Python
1df = df_org[df_org['C'] > 0].copy()
2df['D2'] = df['B'] / df['C']
3# A B C D
4# 0 2015-01 1 2 0.50
5# 1 2015-02 2 2 1.00
6# 2 2015-03 3 4 0.75
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。