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

После проблемы я получил DataFrame примерно так:

df = pd.DataFrame(columns=pd.MultiIndex(levels=[["foo","baa"],["x","y","z"]], labels=[[0,0,0,1,1,1],[0,1,2,0,1,2]]), index=[0,1,2,3], data=np.random.rand(4,6))

         foo                           baa                    
          x         y         z         x         y         z
0  0.263780  0.942880  0.176744  0.914854  0.920735  0.573692
1  0.601317  0.584691  0.288536  0.832064  0.095142  0.186045
2  0.807323  0.075620  0.399703  0.936894  0.168441  0.468984
3  0.871293  0.324817  0.395784  0.133541  0.365586  0.615219

И я хочу сказать foo из него в новый DataFrame, полностью пустой, сконструированный так:

r_df = pd.DataFrame(index=df.index)
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]

это должно выглядеть так:

         foo
          x         y         z
0  0.263780  0.942880  0.176744
1  0.601317  0.584691  0.288536
2  0.807323  0.075620  0.399703
3  0.871293  0.324817  0.395784

Как я пытался это сделать, было так:

for label in df.columns.levels[0]:
    data = df[label]
    for row in data.index:
        r_df.loc[row,(label,"x")] = data["x"]
        r_df.loc[row,(label,"y")] = data["y"]
        r_df.loc[row,(label,"z")] = data["z"]

Я думал, что это может сработать, потому что tubles могут ссылаться на мультииндекс, но это не так.

1 Ответ

0 голосов
/ 10 октября 2018

Попробуйте следующее, используя df.xs, чтобы выбрать из multiIndex и сохранить уровень:

r_df = df.xs('foo', axis=1, level=0, drop_level=False)

Если вы хотите добавить новый столбец в foo, вы можете сделать:

df.loc[:,('foo','m')] = 0

, если вы хотите добавить новый столбец в level=0 (тот же уровень, что и foo)

# with no col in level 1
df.loc[:, 'bar'] = 0 

# with col in level 0 and 1
df.loc[:,('bar','m')] = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...