Массив Numpy как элемент в фрейме данных Pandas

#python #pandas #dataframe #multidimensional-array

#python #pandas #фрейм данных #многомерный массив

Вопрос:

Как мне поместить массив numpy в элемент (отдельную ячейку) фрейма данных Pandas? Например,

 Driver  Make  Model  Coordinates
Bob     Ford  Focus  [[1, 0, 1],[1, 2, 3], [2, 0, 2]]
Sally   Ford  Echo   [[0, 0, 1],[0, 2, 0]]
  

Я пытался сохранить массив в каждой строке, но документация, похоже, не поддерживает это.

Контекст:

Я надеюсь использовать df.to_json() для экспорта данных в файл json, из которого данные впоследствии могут быть считаны в фрейм данных, где каждая строка является одним из отдельных элементов. Должен ли я думать о том, чтобы сделать это по-другому?

Ответ №1:

Да, вы можете. Используйте .at[] или .iat[] , чтобы избежать широковещательного поведения при попытке поместить итерацию в одну ячейку. Это также относится к list и set .

Плохая вещь: может быть довольно сложно выполнить такое назначение оптимизированным способом, который не требует итерации по строкам. Тем не менее, это все еще выполнимо для массивов разумного размера. И если вам действительно нужно хранить миллионы таких массивов, может потребоваться фундаментальный редизайн. Например. реструктурируйте свой код, используйте вместо него MongoDB или другие инструменты хранения и т. Д.

 import pandas as pd
import numpy as np

# preallocate the output dataframe
df = pd.DataFrame(
    data=np.zeros((2,4), dtype=object),
    columns=["Driver", "Make", "Model", "Coordinates"]
)

# element-wise assignment
df.at[0, "Coordinates"] = np.array([[1, 0, 1],[1, 2, 3], [2, 0, 2]])
df.at[1, "Coordinates"] = np.array([[0, 0, 1],[0, 2, 0]])
# other elements were omitted
  

Результат

 print(df)
  Driver Make Model                        Coordinates
0      0    0     0  [[1, 0, 1], [1, 2, 3], [2, 0, 2]]
1      0    0     0             [[0, 0, 1], [0, 2, 0]]

print(df.at[0, "Coordinates"])
[[1 0 1]
 [1 2 3]
 [2 0 2]]

print(type(df.at[0, "Coordinates"]))
<class 'numpy.ndarray'>
  

Комментарии:

1. Спасибо. Понятно, что проблемы, с которыми я столкнулся, были связаны с «широковещательным» поведением, пытающимся интерпретировать несколько строк матрицы как строки в фрейме данных pandas. Метод «.at» исправил это.