Мультипликация Pandas DataFrame с отсутствующими значениями - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть 2 кадра данных

                 Value
Location Time          
Hawai    2000  1.764052
         2002  0.400157
Torino   2000  0.978738
         2002  2.240893
Paris    2000  1.867558
         2002 -0.977278
                       2000  2002
Country Unit Location            
US      USD  Hawai        2     8
IT      EUR  Torino       4    10
FR      EUR  Paris        6    12  

Создано с

np.random.seed(0)
tuples = list(zip(*[['Hawai', 'Hawai', 'Torino', 'Torino',
                     'Paris', 'Paris'],
                      [2000, 2002, 2000, 2002, 2000,2002]]))

idx = pd.MultiIndex.from_tuples(tuples, names=['Location', 'Time'])

df = pd.DataFrame(np.random.randn(6, 1), index=idx, columns=['Value'])



df2 = pd.DataFrame({'Country': [ 'US', 'IT', 'FR'],
                'Unit': [ 'USD', 'EUR', 'EUR'],
                  'Location': [ 'Hawai', 'Torino', 'Paris'],
                  '2000': [2, 4,6],
                    '2002': [8,10,12]
                   })
df2.set_index(['Country','Unit','Location'],inplace=True)

Я хочу умножить каждый столбец из df2 на соответствующее Значение из df1
Этот код хорошо работает

df2.columns=df2.columns.astype(int)
s=df.Value.unstack(fill_value=1)
df2 = df2.mul(s)

и производит

              2000       2002
Country Unit Location                      
US      USD  Hawai      3.528105   3.201258
IT      EUR  Torino     3.914952  22.408932
FR      EUR  Paris     11.205348 -11.727335

Теперь я хочу обработать случай, когда в df2 отсутствует значение, представленное как '..', поэтому умножаем числовые значения и пропускаем остальные

    2000  2002
Country Unit Location           
US      USD  Hawai       2     8
IT      EUR  Torino     ..    10
FR      EUR  Paris       6    12  

выполнение приведенного выше кода приводит к ошибке TypeError: невозможно умножить последовательность на не-int типа 'float'
Есть идеи, как добиться этого результата?

2000       2002
    Country Unit Location                      
    US      USD  Hawai      3.528105   3.201258
    IT      EUR  Torino     ..  22.408932
    FR      EUR  Paris     11.205348 -11.727335

1 Ответ

0 голосов
/ 23 февраля 2019

Я думаю, что лучше здесь использовать вместо пропущенных значений .. на to_numeric с errors='coerce', поэтому делим работу очень хорошо:

df2 = pd.DataFrame({'Country': [ 'US', 'IT', 'FR'],
                'Unit': [ 'USD', 'EUR', 'EUR'],
                  'Location': [ 'Hawai', 'Torino', 'Paris'],
                  '2000': [2, '..',6],
                    '2002': [8,10,12]
                   })
df2.set_index(['Country','Unit','Location'],inplace=True)

df2.columns=df2.columns.astype(int)
s= df.Value.unstack(fill_value=1)
df2 = df2.apply(lambda x: pd.to_numeric(x, errors='coerce')).mul(s)
print (df2)
                            2000       2002
Country Unit Location                      
US      USD  Hawai      3.528105   3.201258
IT      EUR  Torino          NaN  22.408932
FR      EUR  Paris     11.205348 -11.727335

Если только не числовые значения.. другое решение - это использование replace:

df2 = df2.replace('..', np.nan).mul(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...