Pandas SettingWithCopyWarning для заполнения с помощью MultiIndex DataFrame - PullRequest
1 голос
/ 31 мая 2019

Строка с fillna() вызывает предупреждение, даже если оно не выполняется на месте. Почему это так?

import pandas as pd
import numpy as np


tuples = [('foo', 1), ('foo', 2), ('bar', 1), ('bar', 2)]
index = pd.MultiIndex.from_tuples(tuples)

df = pd.DataFrame(np.random.randn(2, 4), columns=index)
df.loc[0, ('foo', 1)] = np.nan

# this works without warning
# df = pd.DataFrame({'foo': [1, np.nan, 3], 'bar': [np.nan, 22, 33]]})  

df1 = df[['foo', 'bar']]
# df1 = df[['foo', 'bar']].copy()  # this does not help
filled = df1.fillna({'foo': 100, 'bar': 200}, inplace=False)

Проблема не появляется, если foo и bar - обычные столбцы, не мультииндексированные.

1 Ответ

0 голосов
/ 31 мая 2019

Это ложное срабатывание , здесь предупреждение не должно выдаваться.Я думаю, проблема в том, что fillna не понимает, что "foo" и "bar" применяются к определенным уровням ваших столбцов MultiIndex.

Я бы порекомендовал вызвать fillna внутри GroupBy в качестве обходного пути до тех пор, пока эта функция не будет реализована.

fill = {'foo': 100, 'bar': 200}
df1.groupby(level=0, axis=1).apply(lambda x: x.fillna(fill[x.name]))

          foo                 bar          
            1         2         1         2
0  100.000000  1.040531 -1.516983 -0.866276
1   -0.055035 -0.107310  1.365467 -0.097696

В качестве альтернативы, чтобы использовать fillna напрямую, укажите набор кортежей (потому что, MultiIndex),

df1.fillna({('foo', 1): 100, ('foo', 2): 100})

          foo                 bar          
            1         2         1         2
0  100.000000  1.040531 -1.516983 -0.866276
1   -0.055035 -0.107310  1.365467 -0.097696
...