Преобразование списка кортежей в серию Pandas - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть список кортежей, которые я хочу преобразовать в серию.

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 пар (возможно произвольно?)

1010 * Е.Г. *

return a

 0    0.071429
 1    0.083333
 3    0.058824

Как бы получить серию, не отбрасывая пары ключей-значений?

Ответы [ 4 ]

0 голосов
/ 18 ноября 2018

Использование 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
0 голосов
/ 18 ноября 2018

Проблема в том, что при преобразовании списка кортежей в словарь 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
0 голосов
/ 18 ноября 2018

Использование zip и распаковка последовательности:

idx, values = zip(*L)

a = pd.Series(values, idx)

С дублирующимися индексами, как в ваших данных, dict не поможет, так как дублирующие ключи словаря не разрешены: dict будет принимать только последнее значение для каждого предоставленного ключа.

0 голосов
/ 18 ноября 2018

Используйте 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
...