DataFrame.from_dict не может изменить dict с ключами кортежа в мультииндексный фрейм данных - PullRequest
0 голосов
/ 09 ноября 2018

Я очень запутался с DataFrame.from_dict.Кажется, DataFrame.from_dict работает правильно на dict с кортежем dict случайно @ _ @.Серьезно, я попробовал некоторые случаи ниже.

case1:

dict_var1 = {('a', 'b'): [43,47], ('a', 'c'): [23,40], ('b', 'c'): [30,35], ('c', 'd'): [10,30], ('a', 'd'): [23,28]}
frame_var1 = pd.DataFrame.from_dict(dict_var1, orient='index', columns=['num', 'cnt'])
print(frame_var1.index)

result1:

Index([('a', 'b'), ('a', 'c'), ('b', 'c'), ('c', 'd'), ('a', 'd')], dtype = 'object')

case2:

dict_var2 = {('a', 'b'): {'num': 43, 'cnt': 47}, ('a', 'c'): {'num': 23, 'cnt': 40}, ('b', 'c'): {'num': 30, 'cnt': 35}, ('c', 'd'): {'num': 10, 'cnt': 30}, ('a', 'd'): {'num': 23, 'cnt': 28}}
frame_var2 = pd.DataFrame.from_dict(dict_var2, orient='index', columns=['num', 'cnt'])
print(frame_var2.index)

result2:

MultiIndex (уровни = [['a', 'b', 'c'], ['b', 'c', 'd']], метки = [[0, 0, 0, 1, 2], [0, 1, 2, 1, 2]])

question :

Когда я меняю тип значений dict со списка на dict,DataFrame.from_dict может изменить ключи dict кортежа в многоиндексное право.Кто-нибудь может объяснить, как DataFrame.from_dict работает, приводя к этим результатам?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

База на документе

if orient == 'index':
    if len(data) > 0:
        # TODO speed up Series case
        if isinstance(list(data.values())[0], (Series, dict)):
            data = _from_nested_dict(data)
        else:
            data, index = list(data.values()), list(data.keys())

Так что в вашем случае второй пройдет isinstance, тогда будет

data = _from_nested_dict(data)

Но первым типом значений является список, затем

data, index = list(data.values()), list(data.keys())
0 голосов
/ 09 ноября 2018

Это не 100% ответ, а просто чтобы показать, что вы можете заставить его работать с dict_var1 так же, как работает dict_var2.

Причиной этого является деталь реализации. Но похоже, что pd.DataFrame (или pd.DataFrame.from_dict(..., orient='columns')) одобряет dict_var1, если вы представите его в столбчатой ​​форме:

frame_var1 = pd.DataFrame(dict_var1, index=['num', 'cnt']).T
print(frame_var1)
     num  cnt
a b   43   47
  c   23   40
b c   30   35
c d   10   30
a d   23   28

Принимая во внимание, что pd.DataFrame.from_dict(..., orient='index') предпочитает dict_var2 с ключами в качестве индекса.

frame_var2 = pd.DataFrame.from_dict(
    dict_var2, orient='index', columns=['num', 'cnt'])
print(frame_var2)
     num  cnt
a b   43   47
  c   23   40
  d   23   28
b c   30   35
c d   10   30

Дайте мне знать, если я смогу объяснить дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...