У меня есть список кортежей, которые я хочу преобразовать в серию.
return array2
[(0, 0.07142857142857142),
(0, 0.07142857142857142),
(1, 0.08333333333333333),
(1, 0.3333333333333333),
(1, 0.3333333333333333),
(1, 0.08333333333333333),
(3, 0.058823529411764705),
(3, 0.058823529411764705)]
Я пытаюсь сделать это, преобразовав список в словарь, а затем в серию:
a = pd.Series(dict(array2))
Однако результирующая серия ведет себя не так, как мне нужно. Кажется, отбрасывает пары key:value (возможно, произвольно?)
Например.
return a
0 0.071429
1 0.083333
3 0.058824
Как мне получить серию, не отбрасывая пары ключ-значение?






Используйте конструктор DataFrame с set_index по первому столбцу, затем выберите второй столбец для Series:
a = pd.DataFrame(array2).set_index(0)[1]
print (a)
0
0 0.071429
0 0.071429
1 0.083333
1 0.333333
1 0.333333
1 0.083333
3 0.058824
3 0.058824
Name: 1, dtype: float64
Или создайте 2 списка и перейдите к конструктору Series:
idx = [x[0] for x in array2]
vals = [x[1] for x in array2]
a = pd.Series(vals, index=idx)
print (a)
0 0.071429
0 0.071429
1 0.083333
1 0.333333
1 0.333333
1 0.083333
3 0.058824
3 0.058824
dtype: float64
Проблема в том, что при преобразовании списка кортежей в словарь Python удаляет все повторяющиеся ключи и использует только последнее значение для каждого ключа. Это необходимо, поскольку каждый ключ может появляться в словаре только один раз. Поэтому вам нужно использовать метод, который сохраняет все записи. Это сделает это:
df = pd.DataFrame.from_records(array2, columns=['key', 'val'])
df = df.set_index('key')
a = df['val']
Пример:
import pandas as pd
array2 = [
(0, 0.07142857142857142),
(0, 0.07142857142857142),
(1, 0.08333333333333333),
(1, 0.3333333333333333),
(1, 0.3333333333333333),
(1, 0.08333333333333333),
(3, 0.058823529411764705),
(3, 0.058823529411764705)
]
df = pd.DataFrame.from_records(array2, columns=['key', 'val'])
df = df.set_index('key')
a = df['val']
print(a)
# key
# 0 0.071429
# 0 0.071429
# 1 0.083333
# 1 0.333333
# 1 0.333333
# 1 0.083333
# 3 0.058824
# 3 0.058824
# Name: val, dtype: float64
Использование MultiIndex
pd.MultiIndex.from_tuples(L).to_frame()[1].reset_index(level=1,drop=True)
Out[79]:
0 0.071429
0 0.071429
1 0.083333
1 0.333333
1 0.333333
1 0.083333
3 0.058824
3 0.058824
Name: 1, dtype: float64
готовое решение :)
Вы можете использовать np.transpose для распаковки столбцов, а затем создать pd.Series:
import numpy as np
import pandas as pd
x, y = np.transpose(array2)
pd.Series(y, x)
Это быстрее, чем pd.Series.T (транспонирование)?
Или вы можете использовать x, y = zip(*array2), чтобы избавиться от необходимости загружать Numpy. Кроме того, это сохраняет тип индекса (int).
Ой. Это уже было предложено @jpp. Прости.
Предполагая, что ваш список кортежей
tuples = [(0, 0.07142857142857142),
(0, 0.07142857142857142),
(1, 0.08333333333333333),
(1, 0.3333333333333333),
(1, 0.3333333333333333),
(1, 0.08333333333333333),
(3, 0.058823529411764705),
(3, 0.058823529411764705)]
Я бы использовал (явное лучше, чем неявное):
pd.Series([value for _, value in tuples], index=[index for index, _ in tuples])
Тем не менее, я бы также пересмотрел вопрос о том, является ли формат данных серии подходящим и значимым: индекс фактически должен быть похож на dict, а именно сопоставить уникальное значение со значением.
Привет, если мне нужен столбец только из этих кортежей ... Как это сделать @jezrael