web-dev-qa-db-ja.com

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

次のようなタプルのリストがあります

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

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

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

70
gt6989b

以下を作成した後、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
63
Roman Pekar

データはそのままにしておくほうが良いと私は言います:

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を使用するだけで、それは純粋に、それがどのセマンティックエンティティであるかについての列の規則に基づいています。

45
ely

これは私がこの質問に来たときに見ると期待したものです:

#!/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
27
Martin Thoma