2012-03-18 27 views
51

私はパンダを使っていくつかのデータを操作しましたが、今度はバッチをデータベースに保存し直したいと思います。これには、データフレームをタプルの配列に変換する必要があります。各タプルはデータフレームの「行」に対応しています。私のようなタプルの配列に変換したいパンダはデータフレームをタプルの配列に変換します

In [182]: data_set 
Out[182]: 
    index data_date data_1 data_2 
0 14303 2012-02-17 24.75 25.03 
1 12009 2012-02-16 25.00 25.07 
2 11830 2012-02-15 24.99 25.15 
3 6274 2012-02-14 24.68 25.05 
4 2302 2012-02-13 24.62 24.77 
5 14085 2012-02-10 24.38 24.61 

私のデータフレームは、何かのように見えます

[(datetime.date(2012,2,17),24.75,25.03), 
(datetime.date(2012,2,16),25.00,25.07), 
...etc. ] 

私はこれを効率的に行うことができますどのように上の任意の提案?

+1

2017+でこの回答になる人には、[新しい慣用的な解決策](https://stackoverflow.com/a/34551914/3707607)があります。あなたは 'list(df.itertuples(index = False、name = None))'を使用することができます。 –

答えて

96

方法について:

subset = data_set[['data_date', 'data_1', 'data_2']] 
tuples = [tuple(x) for x in subset.values] 
+1

私が思いついた解決策よりはるかにクリーンなWesです。パンダの一般的な仕事はすごく面白かったけど、面白いです。 – enrishi

+0

'.itertuples'の使用については下記の@ ksindiの答えを参照してください。これは、値を配列として取得し、それらをタプルに変換するより効率的です。 – vy32

31

一般的な方法:17.1のよう

[tuple(x) for x in data_set.to_records(index=False)] 
31
list(data_set.itertuples(index=False)) 

、上記はnamedtuplesのリストを返します - docsを参照してください。

+4

これは受け入れられる回答IMHOでなければなりません(今度は専用の機能が存在します)。ところで、あなたが通常の 'tuple'を' namedtuple'sの代わりに 'zip'イテレータに入れたいのであれば、' data_set.itertuples(index = False、name = None) 'を呼んでください。 – Axel

7

ここに示されているようtupleslistを返すベクトル化手法(代わりdfとして定義する、data_setのデータフレームを想定)は次のとおり

>>> df.set_index(['data_date'])[['data_1', 'data_2']].to_records().tolist() 

が生成する:

[(datetime.datetime(2012, 2, 17, 0, 0), 24.75, 25.03), 
(datetime.datetime(2012, 2, 16, 0, 0), 25.0, 25.07), 
(datetime.datetime(2012, 2, 15, 0, 0), 24.99, 25.15), 
(datetime.datetime(2012, 2, 14, 0, 0), 24.68, 25.05), 
(datetime.datetime(2012, 2, 13, 0, 0), 24.62, 24.77), 
(datetime.datetime(2012, 2, 10, 0, 0), 24.38, 24.61)] 

設定の考え方はインデックス軸としてのdatetimeカラムは、Timestampの値をそれに対応するdatetime.datetimeフォーマットに変換する際に役立ちます。 e の引数は、DateTimeIndexデータフレームの場合にそうです。

df.to_records().tolist()        # Supply index=False to exclude index 
2

詳細Python的方法:

これが次に行うことができるrecarrayであろうユースケースに応じ.tolist


より一般化溶液を用いてlistを返すために戻り

df = data_set[['data_date', 'data_1', 'data_2']] 
map(tuple,df.values) 
10

モチベーション
多くのデータセットは、速度/効率に関して懸念する必要があるほど大きくなっています。だから、私はその解決策をその精神で提供します。それはまた、簡潔であることも起こります。比較のために

、またあることを起こる、私はzipの使用を提案し、理解

list(zip(*[df[c].values.tolist() for c in df])) 

[('2012-02-17', 24.75, 25.03), 
('2012-02-16', 25.0, 25.07), 
('2012-02-15', 24.99, 25.15), 
('2012-02-14', 24.68, 25.05), 
('2012-02-13', 24.62, 24.77), 
('2012-02-10', 24.38, 24.61)] 

ますのは、indexコラム

df = data_set.drop('index', 1) 

ソリューション
をドロップしてみましょう特定の列のサブセットを処理したい場合は柔軟性があります。既に表示されている列は、必要な部分集合であると仮定します。

list(zip(*[df[c].values.tolist() for c in ['data_date', 'data_1', 'data_2'])) 

[('2012-02-17', 24.75, 25.03), 
('2012-02-16', 25.0, 25.07), 
('2012-02-15', 24.99, 25.15), 
('2012-02-14', 24.68, 25.05), 
('2012-02-13', 24.62, 24.77), 
('2012-02-10', 24.38, 24.61)] 

すべて以下が同じ結果

  • [tuple(x) for x in df.values]
  • df.to_records(index=False).tolist()
  • list(map(tuple,df.values))
  • list(map(tuple, df.itertuples(index=False)))
0を生成します

速いとは?
zipと理解に大きなマージン

%timeit [tuple(x) for x in df.values] 
%timeit list(map(tuple, df.itertuples(index=False))) 
%timeit df.to_records(index=False).tolist() 
%timeit list(map(tuple,df.values)) 
%timeit list(zip(*[df[c].values.tolist() for c in df])) 

小さなデータ

10000 loops, best of 3: 55.7 µs per loop 
1000 loops, best of 3: 596 µs per loop 
10000 loops, best of 3: 38.2 µs per loop 
10000 loops, best of 3: 54.3 µs per loop 
100000 loops, best of 3: 12.9 µs per loop 

大規模データ

10 loops, best of 3: 58.8 ms per loop 
10 loops, best of 3: 43.9 ms per loop 
10 loops, best of 3: 29.3 ms per loop 
10 loops, best of 3: 53.7 ms per loop 
100 loops, best of 3: 6.09 ms per loop 
+0

あなたはフェアを作っていません比較。あなたのソリューションは、 'list(df.itertuples(index = False、name = None))'より高速ではありません。この答えは人々を混乱させるだけです。もし私があなただったら私はそれを削除します。 –

+0

@TedPetrouなぜそれは公正ではありませんか?誰もあなたが提案したものを提案しませんでした。なぜあなたはそれを答えにしませんか?この2つの答えは、問題全体を明らかにするのに役立ちます。 – piRSquared

+0

ここにあります:https://stackoverflow.com/a/34551914/3707607 –

0
により高速であります10
+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿](/レビュー/低品質の投稿/ 17575022) –

関連する問題