преобразование типа столбцов панд под MultiIndex - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть что-то вроде

>>> df
      user1 user2 param
                   0             1      2
                   a      x      d      a 
    0  2     6     0      1      0      0
    1  4     13    0      0      0      3
    2  21    76    2      0      1      0

Обратите внимание, что user1 и user2 находятся на том же уровне, что и param (побочный эффект слияния):

>>> df.columns.get_level_values(0)
Index(['user1','user2','param','param','param','param'], dtype='object')

>>> df.columns.get_level_values(1)
Index(['','',0,0,1,2], dtype='object')

Я хочу преобразовать все под param в числа с плавающей запятой, но оставить user1 и user2 как целые числа. Я проверил этот поток , но я не уверен, как это преобразуется в значение столбец dtypes.

EDIT:

Код генератора

df = pd.DataFrame({'user1':[2,4,21,21],'user2':[6,13,76,76],'param1':[0,2,0,1],'param2':['x','a','a','d'],'count':[1,3,2,1]}, columns=['user1','user2','param1','param2','count'])
df = df.set_index(['user1','user2','param1','param2'])
df = df.unstack([2,3]).sort_index(axis=1)

df2 = pd.DataFrame({'user1':[2,5,21],'user2':[6,18,76]})
df2.columns = pd.MultiIndex.from_product([df2.columns, [''],['']])
final_df = df2.merge(df, on=['user1','user2'], how='outer').fillna(0)

1 Ответ

0 голосов
/ 03 сентября 2018

Я не могу предоставить вам проверенное решение для конкретного DataFrame, так как не уверен в его точной структуре.

Но в MultiIndex DataFrame (и любом другом) вы можете вносить изменения в отдельные столбцы DataFrame, используя базовые атрибуты Series, которые их составляют. В этом случае вы можете изменить dtypes всех столбцов в параметре, отфильтровав по series.name следующим образом.

df.apply(lambda x: x.astype(float) if 'param' in x.name else x)

Способ, которым pandas создает имена MultiIndex, заключается в создании кортежа с различными уровнями, поэтому операция contains над ним дает вам нужные столбцы.

EDIT:

Я проверил код в вашем образце DataFrame, и он работает.

Видя ваш комментарий. Если вы хотите вручную получить доступ к каждому столбцу и изменить его, вы можете сделать это с помощью метода astype.

final_df['count'] = final_df['count'].astype(float)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...