Это не имеет ничего общего с enumerate
, это красная сельдь.Проблема в том, что вы ищете вывод смешанного типа, в то время как Pandas предпочитает хранить однородные данные.
То, что вы ищете, это не , рекомендуемое для Pandas.Ваш тип данных должен быть int
или float
, а не комбинация.Это влияет на производительность, поскольку единственной простой альтернативой является использование серии object
dtype, которая разрешает операции только во времени Python.Преобразование в object
dtype неэффективно.
Итак, вот что вы можете сделать:
res2 = df2.astype(object).values.tolist()[0]
print(res2)
[1, 6, 4, 2, 3, 5.5]
Один метод, который позволяет избежать преобразования object
:
from itertools import chain
from operator import itemgetter, methodcaller
iter_series = map(itemgetter(1), df2.items())
res2 = list(chain.from_iterable(map(methodcaller('tolist'), iter_series)))
[1, 6, 4, 2, 3, 5.5]
Сравнительный анализ производительности
Если вы хотите список кортежей в качестве вывода, один кортеж для каждой строки, тогда решение на основе серии работает лучше: -
# Python 3.6.0, Pandas 0.19.2
df2 = pd.DataFrame({'a':[1],'l':[2],'m':[3],'k':[4],'s':[5.5],'f':[6]},index=[0])
from itertools import chain
from operator import itemgetter, methodcaller
n = 10**5
df2 = pd.concat([df2]*n)
def jpp_series(df2):
iter_series = map(itemgetter(1), df2.items())
return list(zip(*map(methodcaller('tolist'), iter_series)))
def jpp_object1(df2):
return df2.astype(object).values.tolist()
def jpp_object2(df2):
return list(map(tuple, df2.astype(object).values.tolist()))
assert jpp_series(df2) == jpp_object2(df2)
%timeit jpp_series(df2) # 39.7 ms per loop
%timeit jpp_object1(df2) # 43.7 ms per loop
%timeit jpp_object2(df2) # 68.2 ms per loop