Побудуйте pandas DataFrame зі списку кортежів (row, col, values)


81

У мене є список таких кортежів, як

data = [
('r1', 'c1', avg11, stdev11),
('r1', 'c2', avg12, stdev12),
('r2', 'c1', avg21, stdev21),
('r2', 'c2', avg22, stdev22)
]

і я хотів би помістити їх у панду DataFrame з рядками, позначеними першим стовпцем, і стовпцями, названими другим стовпцем. Здається, спосіб піклуватися про назви рядків - це приблизно так, pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])але як мені подбати про стовпці, щоб отримати матрицю 2x2 (вихід з попереднього набору 3x4)? Чи існує більш розумний спосіб подбати і про мітки рядків, замість того, щоб явно їх опустити?

EDIT Здається, мені знадобляться 2 кадри даних - один для середніх показників і один для стандартних відхилень, це правильно? Або я можу зберегти список значень у кожній "клітинці"?


1
Певна дублікат < stackoverflow.com/questions/11415701 / ... >
Ely

2
@EMS зовсім не. Я бачив це запитання, йому не потрібно було двовимірне обертання.
gt6989b

Я не погоджуюсь - я думаю, ви просто не знайомі з правильним способом складання даних у DataFrame. Як правило, ви хотіли б використовувати інформацію як у стовпці 1, так і в стовпці 2 як індекси, тому ви можете швидко шукати дані за будь-яким з них. Речі у стовпці 2 не належать до назв стовпців, але навіть якщо вони належать, це зовсім інше питання, ніж назва вашого допису. Думаю, редагування заголовка могло б допомогти (хоча я все ще думаю, що це не суттєво інше питання).
елі

1
@ely, gt6989b Я перечитав це "... зі списку кортежів (рядок, колонка, значення)", щоб зрозуміти, чому це не дублікат "... з кортежів"
smci

Відповіді:


65

Ви можете повернути свій DataFrame після створення:

>>> df = pd.DataFrame(data)
>>> df.pivot(index=0, columns=1, values=2)
# avg DataFrame
1      c1     c2
0               
r1  avg11  avg12
r2  avg21  avg22
>>> df.pivot(index=0, columns=1, values=3)
# stdev DataFrame
1        c1       c2
0                   
r1  stdev11  stdev12
r2  stdev21  stdev22

3
Рядок з індексом 0та стовпець з ім'ям 1не дуже красиві ...
drevicko

49

Я вважаю, що краще залишити ваші дані в стос, як вони є:

df = pandas.DataFrame(data, columns=['R_Number', 'C_Number', 'Avg', 'Std'])

# Possibly also this if these can always be the indexes:
# df = df.set_index(['R_Number', 'C_Number'])

Тоді це трохи інтуїтивніше сказати

df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1)

Таким чином, мається на увазі, що ви прагнете змінити середні значення або стандартні відхилення. Тоді як просто використання pivot, воно ґрунтується виключно на умові стовпців щодо того, яку семантичну сутність ви переробляєте.


1
+1, корисна явність. Мене прямо цікавить двовимірна таблиця - щоб я міг шукати значення, проіндексовані списками рядків і стовпців, а також отримувати доступ до кожного з вимірів окремо. Чи можете ви це зробити за допомогою накопичених даних?
gt6989b

2
Так. Набагато краще з накопиченими даними. Подумайте про реляційну таблицю бази даних, як у SQL. Ви не збираєтесь викидати цілу колону в купу повторюваних колон, правда? Це має відбуватися лише в особливих випадках (я думаю, що це високий до широкого візерунок). Зазвичай ви обробляєте кілька стовпців як індекси та робите виділення, частково прив'язуючи один із стовпців індексу, або прив'язуючи їх усі, щоб отримати певний запис.
ely

2
Отже, у вашому випадку, наприклад, після встановлення індексу як [R_Number, C_Number]можна це зробити df.ix[('r1','c2')]. Або ви можете залишити ті , і як звичайні стовпи і логічну індексацію:df[(df.R_Number == 'r1') & (df.C_Number == 'c2')]
Ely

2
Як правило, основним варіантом використання того, з чим ви намагаєтесь займатися, pivotє форматування якоїсь таблиці так, щоб вона красиво друкувалась на екрані або красиво експортувалась у HTML, LaTeX або .csv або щось інше. Як форматування таблиці, яка буде використовуватися для презентації або подання статті. В іншому випадку, щодо ефективної маніпуляції з даними, ви хочете, щоб речі були мультиіндексами, коли це можливо (наприклад, ключі до таблиці бази даних) або принаймні як повторювані стовпці, щоб ви могли ефективно виконувати індексацію та приєднання тощо. хочуть висадити їх у власні колони.
елі

35

Це те, що я очікував побачити, коли прийшов до цього питання:

#!/usr/bin/env python

import pandas as pd


df = pd.DataFrame([(1, 2, 3, 4),
                   (5, 6, 7, 8),
                   (9, 0, 1, 2),
                   (3, 4, 5, 6)],
                  columns=list('abcd'),
                  index=['India', 'France', 'England', 'Germany'])
print(df)

дає

         a  b  c  d
India    1  2  3  4
France   5  6  7  8
England  9  0  1  2
Germany  3  4  5  6

Ви неправильно прочитали питання. Дані, спочатку наведені у запитанні, уже мають мітки рядків і стовпців для кожного запитаного питання.
gt6989b

11
@ gt6989b Ні, я не робив. Я не намагався відповісти на оригінальне запитання, але питання, яке (можливо) виникне у людей, коли вони перейдуть на цю сторінку.
Мартін Тома

8
@MartinThoma Дякую, справді це те, що я шукаю на цій сторінці.
ssword
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.