(row、col、values)のタプルのリストからパンダDataFrameを構築します


81

私はのようなタプルのリストを持っています

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

そして、最初の列で名前が付けられた行と2番目の列で名前が付けられた列を持つパンダDataFrameにそれらを配置したいと思います。行名を処理するpandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])方法は次のようなもののようですが、2x2行列(前のセットからの出力は3x4)を取得するために列を処理するにはどうすればよいですか?行ラベルを明示的に省略するのではなく、行ラベルを処理するよりインテリジェントな方法はありますか?

編集2つのDataFrameが必要になるようです-1つは平均用、もう1つは標準偏差用ですが、それは正しいですか?または、各「セル」に値のリストを保存できますか?



2
@EMSはまったくありません。私はその質問を見ました、彼は2Dピボットを必要としませんでした。
gt6989b 2013年

私は同意しません-あなたはDataFrameにデータをスタックする正しい方法に慣れていないだけだと思います。通常、列1と列2の両方の情報をインデックスとして使用すると、どちらでもデータをすばやく検索できます。列2の項目は列名として属していませんが、たとえそうであるとしても、これは投稿のタイトルとはまったく別の質問です。タイトルを編集することで役立つと思います(それでも意味のある別の質問ではないと思います)。
ely 2013年

1
@ ely、gt6989bこれを「... fromlist of tuples of(row、col、values)」というタイトルに変更して、これが「... fromtuples」の複製ではない理由を明確にしました
smci 2018

回答:


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、有用な明示性。私は2Dテーブルに明確に興味があります。これにより、行リストと列リストの両方でインデックス付けされた値を検索したり、各ディメンションに個別にアクセスしたりできます。スタックされたデータでそれを行うことができますか?
gt6989b 2013年

2
うん。スタックされたデータの方がはるかに優れています。SQLのように、リレーショナルデータベーステーブルについて考えてみてください。列全体を繰り返し列の束に吹き飛ばしませんか?それは特別な場合にのみ起こるはずです(私はそれが背の高いものから広いものへのパターンだと思います)。通常、複数の列をインデックスとして扱い、インデックス列の1つを部分的にバインドするか、すべてをバインドして特定のレコードを取得することで選択を行います。
ely 2013年

2
したがって、あなたの場合、たとえば、インデックスをに設定した後、[R_Number, C_Number]次のことができますdf.ix[('r1','c2')]。それとも、通常の列としてそれらの両方を残して、論理的なインデックスを使用することができますdf[(df.R_Number == 'r1') & (df.C_Number == 'c2')]
イーリー

2
一般に、実行しようとしていることを実行する主な使用例はpivot、画面に適切に印刷されるように、またはHTML、LaTeX、.csvなどに適切にエクスポートされるようにテーブルをフォーマットする場合です。プレゼンテーションや記事の提出に使用されるテーブルをフォーマットするようなものです。それ以外の場合は、データを効率的に操作する限り、可能な場合はマルチインデックス(データベーステーブルへのキーなど)にするか、少なくとも繰り返し列にして、効率的なインデックス作成や結合などを行う必要があります。ただし、そうではありません。それらを独自の列に吹き飛ばしたい。
ely 2013年

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 2017

11
@ gt6989bいいえ、しませんでした。私は元の質問に答えようとはしませんでしたが、人々がこのページに来たときに(かもしれない)質問があります。
Martin Thoma 2017

8
@MartinThomaありがとう、確かにこれは私がこのページで探しているものです。
ssword 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.