私は、インデックス化されたpandasデータフレームに変換したい不明な数のデータ行を返すジェネレータを用意しています。私が知っている最速の方法は、ディスクにCSVを書き込んだり、「read_csv」で解析して戻すことです。私は空のデータフレームを作成し、常に新しい行を追加するのは効率的ではないことを認識しています。私は、返される行の数がわからないので、あらかじめ用意されたデータフレームを作成することはできません。ディスクに書き込むことなくイテレータ出力をpandasデータフレームに変換する方法はありますか?pythonイテレータの出力をpandasデータフレームに変換する最も速い方法
0
A
答えて
1
このような一般的な方法がありますか?
def make_equal_length_cols(df, new_iter, col_name):
# convert the generator to a list so we can append
new_iter = list(new_iter)
# if the passed generator (as a list) has fewer elements that the dataframe, we ought to add NaN elements until their lengths are equal
if len(new_iter) < df.shape[0]:
new_iter += [np.nan]*(df.shape[0]-len(new_iter))
else:
# otherwise, each column gets n new NaN rows, where n is the difference between the number of elements in new_iter and the length of the dataframe
new_rows = [{c: np.nan for c in df.columns} for _ in range((len(new_iter)-df.shape[0]))]
new_rows_df = pd.DataFrame(new_rows)
df = df.append(new_rows_df).reset_index(drop=True)
df[col_name] = new_iter
return df
テストそれを:
make_equal_length_cols(df, (x for x in range(20)), 'new')
Out[22]:
A B new
0 0.0 0.0 0
1 1.0 1.0 1
2 2.0 2.0 2
3 3.0 3.0 3
4 4.0 4.0 4
5 5.0 5.0 5
6 6.0 6.0 6
7 7.0 7.0 7
8 8.0 8.0 8
9 9.0 9.0 9
10 NaN NaN 10
11 NaN NaN 11
12 NaN NaN 12
13 NaN NaN 13
14 NaN NaN 14
15 NaN NaN 15
16 NaN NaN 16
17 NaN NaN 17
18 NaN NaN 18
19 NaN NaN 19
そして渡された発電機は、データフレームよりも短い場合、それはまた、動作します:
make_equal_length_cols(df, (x for x in range(5)), 'new')
Out[26]:
A B new
0 0 0 0.0
1 1 1 1.0
2 2 2 2.0
3 3 3 3.0
4 4 4 4.0
5 5 5 NaN
6 6 6 NaN
7 7 7 NaN
8 8 8 NaN
9 9 9 NaN
編集:削除行単位pandas.DataFrame.append
コール、別のデータフレームを構築してワンショットで追加しました。タイミング:
新追記:
%timeit make_equal_length_cols(df, (x for x in range(10000)), 'new')
10 loops, best of 3: 40.1 ms per loop
旧追記:
very slow...
1
を反復パンダのデータフレームに追加するには、最善の解決策ではありません。データをリストとして構築し、それをpd.DataFrame
に渡す方が良いでしょう。
import random
import pandas as pd
alpha = list('abcdefghijklmnopqrstuvwxyz')
ここでは、その後、データフレームのコンストラクタに渡し、リストを構築するためにそれを使用し、発電機を作成します。
%%timeit
gen = ((random.choice(alpha), random.randint(0,100)) for x in range(10000))
my_data = [x for x in gen]
df = pd.DataFrame(my_data, columns=['letter','value'])
# result: 1 loop, best of 3: 373 ms per loop
これは、発電機を作成するよりもかなり高速である、空のデータフレームを構築行を追加すると次のようになります。
%%timeit
gen = ((random.choice(alpha), random.randint(0,100)) for x in range(10000))
df = pd.DataFrame(columns=['letter','value'])
for tup in gen:
df.loc[df.shape[0],:] = tup
# result: 1 loop, best of 3: 13.6 s per loop
これは、10000行を作成するのに13秒で非常に遅いです。
関連する問題
- 1. Python Pandas: ".value_counts"の出力をデータフレームに変換する
- 2. XMLをPythonオブジェクトに変換する最も速い方法
- 3. JSON列をPandasデータフレームに高速変換
- 4. Python Pandas Dataframe - フラグが '1'の場合、データをNaNに変換する最も速い方法は何ですか?
- 5. xarrayデータセットをdaskデータフレーム内のpandasデータフレームに変換する方法
- 6. python-pandasでデータフレームを高速に大きな行列に変換するには?
- 7. このrnoaaの出力をデータフレームに変換する方法R
- 8. value_counts()の出力をデータフレームに変換する方法は?
- 9. 変換中のエラーpandasデータフレームpython 3
- 10. 要約出力をデータフレームに変換する方法は?
- 11. 4dリストをpandasデータフレームに変換する最適化された方法
- 12. pandasデータフレームをJSONに変換
- 13. Python pandasでは、データフレームの変換速度を向上させる方法はありますか?
- 14. R:Rmongo出力をデータフレームに変換する
- 15. Pandasデータフレーム列をnp.datetime64からdatetimeに変換する方法は?
- 16. rpy2行列オブジェクトをPandasデータフレームに変換する方法は?
- 17. htmlテーブルをpandasデータフレームに変換する方法
- 18. R - データフレーム内の列のデータを変換する最速/最も効率的な方法は?
- 19. Python Pandasデータフレームのリストに列を変換する
- 20. class:str jsonをpythonのpandasデータフレームに変換する
- 21. バイトデータをpython pandasデータフレームに変換するには?
- 22. pandasデータフレームをcsvに変換する
- 23. spark rddをpandasデータフレームに変換する
- 24. pandasデータフレームをオレンジデータテーブルに変換する
- 25. matファイルをpandasデータフレームに変換する
- 26. Pandas Columnをデータフレームに変換する
- 27. htmlテーブルをpandasデータフレームに変換する
- 28. Python ibis(Impala)テーブルをpandasデータフレームに変換する
- 29. python pandas DataFrameをRデータに変換するRデータフレーム
- 30. カテゴリに基づいて、pandasデータフレームの行を列に変換する方法は?
ディスクに書き込まないでください。代わりにそれをタプルのリストにプルし、そのリストを 'pd.DataFrame'に渡します。 – James