2D массив для строк в столбце данных - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть numpy .ndarray, как указано ниже:

x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
labels = [1,0]
df = pd.DataFrame({"a":x,"labels":labels})
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-458-79198b72cdcb> in <module>()
      1 x = np.array([[1, 2, 3], [4, 5, 6]], np.int32).reshape(-1,1)
      2 labels = [1,0,1,0]
----> 3 df = pd.DataFrame({"a":x,"labels":labels})

4 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/construction.py in sanitize_array(data, index, dtype, copy, raise_cast_failure)
    480     elif subarr.ndim > 1:
    481         if isinstance(data, np.ndarray):
--> 482             raise Exception("Data must be 1-dimensional")
    483         else:
    484             subarr = com.asarray_tuplesafe(data, dtype=dtype)

Exception: Data must be 1-dimensional

Я попытался изменить np.ndarray на x.reshape(-1,1), но результат не изменился. Каждый из списков в ndarray x должен быть строкой в ​​кадре данных. Я ожидаю получить:

           a  labels
0  [1, 2, 3]       1
1  [4, 5, 6]       0

1 Ответ

1 голос
/ 17 апреля 2020

Проблема в том, что, поскольку a является многомерным однородным массивом, pandas не знает, как разбить на несколько строк. В целом pandas не поддерживает встроенные структуры. Подумайте о случае с массивом более высокой размерности как (3,4,2), как с этим бороться?

Обратите внимание, что столбцы данных создаются с помощью отдельных вызовов конструктора pd.Series. Непосредственно пытаясь построить ряд из ndarray, мы получаем ту же явную ошибку:

pd.Series(x)
    ...
    480     elif subarr.ndim > 1:
    481         if isinstance(data, np.ndarray):
--> 482             raise Exception("Data must be 1-dimensional")
    483         else:
    484             subarr = com.asarray_tuplesafe(data, dtype=dtype)
Exception: Data must be 1-dimensional

Таким образом, вы должны превратить массив в итеративный, где каждое из его значений будет быть строкой кадра данных. Для этого вы можете распаковать значения массива numpy в отдельные списки:

df = pd.DataFrame({"a":[*x], "labels":labels}) # or .."a":list(x)..

print(df)
           a  labels
0  [1, 2, 3]       1
1  [4, 5, 6]       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...