Преобразование numpy ndarray словарей в DataFrame - PullRequest
1 голос
/ 24 января 2020

Я искал stackoverflow для решения этой проблемы -> но все решения немного отличаются от моих потребностей.

У меня есть большой ndarray (примерно 107 миллионов строк), который можно назвать df:

    [{'A': 5, 'C': 3, 'D': 3},
     {'A': 7, 'B': 9, 'F': 5},
     {'B': 4, 'C': 7, 'E': 6}]

Мне нужно, чтобы он был преобразован в DataFrame как можно быстрее. Вот пример желаемого вывода:

     A    B    C    D    E    F
0  5.0  NaN  3.0  3.0  NaN  NaN
1  7.0  9.0  NaN  NaN  NaN  5.0
2  NaN  4.0  7.0  NaN  6.0  NaN

Я пробовал pd.DataFrame(df) и pd.DataFrame.from_dict(df), но они дают мне вывод:

     0
0  {'A': 5, 'C': 3, 'D': 3}
1  {'A': 7, 'B': 9, 'F': 5}
2  {'B': 4, 'C': 7, 'E': 6}

Вопрос: Как мне конвертировать df до желаемого выхода?

РЕДАКТИРОВАТЬ:

Я пробовал решение anky_91. Это будет работать для списка, а не для ndarray. Я хочу избежать преобразования в список, поскольку наличие 107 миллионов значений в списке приводит к ошибкам памяти.

pd.DataFrame(df).sort_index(axis=1)

Это все равно дает мне тот же вывод, что и pd.DataFrame (df). Он выводит DataFrame, содержащий один столбец со словарем в каждой строке.

1 Ответ

1 голос
/ 24 января 2020

Я думаю, что входные данные различны:

L =  [[{'A': 5, 'C': 3, 'D': 3}],
     [{'A': 7, 'B': 9, 'F': 5}],
     [{'B': 4, 'C': 7, 'E': 6}]]

print (pd.DataFrame(L))
                          0
0  {'A': 5, 'C': 3, 'D': 3}
1  {'A': 7, 'B': 9, 'F': 5}
2  {'B': 4, 'C': 7, 'E': 6}

Возможное решение - это выравнивание:

from  itertools import chain
df = pd.DataFrame(chain.from_iterable(L)).sort_index(axis=1)
print (df)
     A    B    C    D    E    F
0  5.0  NaN  3.0  3.0  NaN  NaN
1  7.0  9.0  NaN  NaN  NaN  5.0
2  NaN  4.0  7.0  NaN  6.0  NaN

Если входные данные numpy массив использовать решение из комментария @Code Different:

arr = np.array([{'A': 5, 'C': 3, 'D': 3},
                {'A': 7, 'B': 9, 'F': 5},
                {'B': 4, 'C': 7, 'E': 6}])

df = pd.DataFrame(arr.tolist()).sort_index(axis=1)
print (df)
     A    B    C    D    E    F
0  5.0  NaN  3.0  3.0  NaN  NaN
1  7.0  9.0  NaN  NaN  NaN  5.0
2  NaN  4.0  7.0  NaN  6.0  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...