Создать новый столбец для в мультииндексном фрейме данных и заполнить - PullRequest
0 голосов
/ 30 июня 2018

Допустим, у меня есть следующий мультииндексированный фрейм данных, сгенерированный с помощью следующего кода:

import pandas as pd, numpy as np

names = ['Name1','Name2','Name3','Name4']
values = ['x1','x2','x3','x4']
categories = ['y1','y2','y3']

x1 = pd.Series([0, 0, 0], index=categories)

index = pd.MultiIndex.from_product([names, values]); placeholders = np.zeros((len(names)*len(values), len(categories)))

df = pd.DataFrame(placeholders, index=index, columns=categories)

for i in names:
    for j in values:
        df.loc[i,j] = x1

           y1   y2   y3
Name1 x1  0.0  0.0  0.0
      x2  0.0  0.0  0.0
      x3  0.0  0.0  0.0
      x4  0.0  0.0  0.0
Name2 x1  0.0  0.0  0.0
      x2  0.0  0.0  0.0
      x3  0.0  0.0  0.0
      x4  0.0  0.0  0.0
Name3 x1  0.0  0.0  0.0
      x2  0.0  0.0  0.0
      x3  0.0  0.0  0.0
      x4  0.0  0.0  0.0
Name4 x1  0.0  0.0  0.0
      x2  0.0  0.0  0.0
      x3  0.0  0.0  0.0
      x4  0.0  0.0  0.0

Как бы я использовал словарь, такой как следующий, чтобы заполнить столбец y3, соответствующий строке x1 и заполнить np.nan для значений для любых других строк в столбце y3 или когда задано Имя (т.е. Имя1, Имя2, Имя3 и т. Д.) Не является ключом в словаре?

{'Name1': 54, 'Name3': 50}

Ожидаемый результат (0 может быть np.nan):

           y1   y2   y3
Name1 x1  0.0  0.0   54
      x2  0.0  0.0  0.0
      x3  0.0  0.0  0.0
      x4  0.0  0.0  0.0
Name2 x1  0.0  0.0  0.0
      x2  0.0  0.0  0.0
      x3  0.0  0.0  0.0
      x4  0.0  0.0  0.0
Name3 x1  0.0  0.0   50
      x2  0.0  0.0  0.0
      x3  0.0  0.0  0.0
      x4  0.0  0.0  0.0
Name4 x1  0.0  0.0  0.0
      x2  0.0  0.0  0.0
      x3  0.0  0.0  0.0
      x4  0.0  0.0  0.0

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Вы можете создать обновление df, используя update

d={'Name1': 54, 'Name3': 50}
updatedf=pd.DataFrame(data=list(d.values()),columns=['y3'],index=pd.MultiIndex.from_arrays([list(d.keys()),['x1','x1']]))
df.update(updatedf)
df
Out[229]: 
           y1   y2    y3
Name1 x1  0.0  0.0  54.0
      x2  0.0  0.0   0.0
      x3  0.0  0.0   0.0
      x4  0.0  0.0   0.0
Name2 x1  0.0  0.0   0.0
      x2  0.0  0.0   0.0
      x3  0.0  0.0   0.0
      x4  0.0  0.0   0.0
Name3 x1  0.0  0.0  50.0
      x2  0.0  0.0   0.0
      x3  0.0  0.0   0.0
      x4  0.0  0.0   0.0
Name4 x1  0.0  0.0   0.0
      x2  0.0  0.0   0.0
      x3  0.0  0.0   0.0
      x4  0.0  0.0   0.0
0 голосов
/ 30 июня 2018

Идиоматическим способом, вероятно, является использование update

In [31]: df2 = pd.DataFrame({(k,'x1'): {'y3': v} for k, v in d.items()}).T

In [32]: df2
Out[32]: 
          y3
Name1 x1  54
Name3 x1  50

In [33]: df.update(df2)

In [34]: df
Out[34]: 
           y1   y2    y3
Name1 x1  0.0  0.0  54.0
      x2  0.0  0.0   0.0
      x3  0.0  0.0   0.0
      x4  0.0  0.0   0.0
Name2 x1  0.0  0.0   0.0
      x2  0.0  0.0   0.0
      x3  0.0  0.0   0.0
      x4  0.0  0.0   0.0
Name3 x1  0.0  0.0  50.0
      x2  0.0  0.0   0.0
      x3  0.0  0.0   0.0
      x4  0.0  0.0   0.0
Name4 x1  0.0  0.0   0.0
      x2  0.0  0.0   0.0
      x3  0.0  0.0   0.0
      x4  0.0  0.0   0.0
0 голосов
/ 30 июня 2018

Есть много способов сделать это, один простой способ - использовать .loc indexers:

d = {'Name1': 54, 'Name3': 50}

for i in d.keys():
    df.loc[i,'x1']['y3'] = d[i]
...