Как преобразовать десятичное в двоичное значение строк в мультииндексном фрейме данных (python)? - PullRequest
0 голосов
/ 04 марта 2019

Не могли бы вы дать мне знать, как преобразовать десятичное в двоичное значение строк в мультииндексном фрейме данных?

ниже - это фрейм данных, который я использовал

from pandas import Series, DataFrame

raw_data = {'Function': ['env', 'env', 'env', 'func1', 'func1', 'func1'],
            'Type': ['In', 'In', 'In', 'In','In', 'out'],
            'Name': ['Volt', 'Temp', 'BD#', 'Name1','Name2', 'Name3'],
            'Val1': ['Max', 'High', '1', '3', '5', '6'],
            'Val2': ['Typ', 'Mid', '2', '4', '7', '6'],
            'Val3': ['Min', 'Low', '3', '3', '6', '3'],
            'Val4': ['Max', 'High', '4', '3', '9', '4'],
            'Val5': ['Max', 'Low', '5', '3', '4', '5'] }
df = DataFrame(raw_data)
df= df.set_index(["Function", "Type","Name"])
print (df)

ниже - это напечатанный фрейм данных

                            Val1    Val2    Val3    Val4    Val5
 Function   Type    Name                    
 env        In      Volt    Max     Typ     Min     Max     Max
                    Temp    High    Mid     Low     High    Low
                    BD#     1       2       3       4       5
 func1      In      Name1   3       4       3       3       3
                    Name2   5       7       6       9       4
            out     Name3   6       6       3       4       5

Я хочу преобразовать десятичные значения в двоичные значения строк (func1 - In - Name1,Name2) в многоиндексном фрейме данных.

ниже ожидаемого, если я хочу.

                            Val1    Val2    Val3    Val4    Val5
 Function   Type    Name                    
 env        In      Volt    Max     Typ     Min     Max     Max
                    Temp    High    Mid     Low     High    Low
                    BD#     1       2       3       4       5
 func1      In      Name1   11      100     11      11      11
                    Name2   101     111     110     1001    100
            out     Name3   6       6       3       4       5

Я пытался получить правильные результаты, но мне не удалось.TT

Плз, дайте мне знать, как решить это просто.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Создавая маску кадра данных:

mask = ((df.index.get_level_values('Function') == 'func1')&
                (df.index.get_level_values('Type') == 'In')&
                (df.index.get_level_values('Name').isin(['Name1', 'Name2'])))

df[mask] = df[mask].astype(int).applymap(lambda x: format(x, 'b'))  

print(df[mask])

                     Val1 Val2 Val3  Val4 Val5
Function Type Name                            
env      In   Volt    Max  Typ  Min   Max  Max
              Temp   High  Mid  Low  High  Low
              BD#       1    2    3     4    5
func1    In   Name1    11  100   11    11   11
              Name2   101  111  110  1001  100
         out  Name3     6    6    3     4    5
0 голосов
/ 04 марта 2019

Используйте MultiIndex.get_level_values для создания условий, соедините их вместе и установите новые значения с помощью f-string s:

m1 = df.index.get_level_values(0) == 'func1'
m2 = df.index.get_level_values(1) == 'In'

df[m1 & m2] = df[m1 & m2].astype(int).applymap(lambda x: f'{x:b}')
print (df)
                     Val1 Val2 Val3  Val4 Val5
Function Type Name                            
env      In   Volt    Max  Typ  Min   Max  Max
              Temp   High  Mid  Low  High  Low
              BD#       1    2    3     4    5
func1    In   Name1    11  100   11    11   11
              Name2   101  111  110  1001  100
         out  Name3     6    6    3     4    5
...