Проблема в extract_index
, а также несколько sanitize_array
. Чтобы дать полное представление:
import pandas as pd
from pandas.core.internals.construction import init_dict
#pd.DataFrame({'a':{1,2,3}})
data = {'a': {1,2,3}}
index = None
columns = None
dtype = None
Построение по указанию продлится go через этот блок
elif isinstance(data, dict):
mgr = init_dict(data, index, columns, dtype=dtype)
И вы увидите, что индекс неверен:
BlockManager
Items: Index(['a'], dtype='object')
Axis 1: RangeIndex(start=0, stop=4, step=1)
ObjectBlock: slice(0, 1, 1), 1 x 4, dtype: object
Это происходит потому, что init_dict
делает это , который передает arrays=[{1, 2, 3}]
в extract_index
и pandas считает набор равным list_like
. Это означает, что длина этого набора принимает в качестве длины индекса .
from pandas.core.dtypes.common import is_list_like
is_list_like({1,2,3})
#True
Другая проблема связана с разницей в ndim
массива, в котором хранятся списки. или набор, поэтому базовый np.array
создается по-другому. Это довольно скрыто здесь
np.array({1,2,3}).ndim
#0
np.array([1,2,3]).ndim
#1
Итак, набор обрабатывается как «скаляр», который транслируется на весь RangeIndex, указанный выше, и становится array([{1, 2, 3}, {1, 2, 3}, {1, 2, 3}], dtype=object)
, тогда как список остается как array([1, 2, 3])
Поскольку при извлечении индекса возникает проблема, простой обходной прием - указать индекс, чтобы он не go ни через один из них.
pd.DataFrame({'a': {1,2,3}}, index=[0])
# a
#0 {1, 2, 3}