1. ホーム
  2. python

[解決済み] データフレームを複数のデータフレームに分割する

2022-02-18 15:22:43

質問

非常に大きなデータフレーム(約100万行)があり、実験(60人の回答者)のデータがあります。

データフレームを60個のデータフレームに分割したい(参加者ごとにデータフレームがある)。

データフレームに data という変数があります。 'name' これは、各参加者のユニークなコードです。

以下のように試してみましたが、何も起こりません(もしくは1時間以内に実行が止まりません)。私が行おうとしているのは data を小さなデータフレームに分割し、それらをリスト ( datalist ):

import pandas as pd

def splitframe(data, name='name'):
    
    n = data[name][0]

    df = pd.DataFrame(columns=data.columns)

    datalist = []

    for i in range(len(data)):
        if data[name][i] == n:
            df = df.append(data.iloc[i])
        else:
            datalist.append(df)
            df = pd.DataFrame(columns=data.columns)
            n = data[name][i]
            df = df.append(data.iloc[i])
        
    return datalist

エラーメッセージは表示されませんが、スクリプトは永遠に実行されるようです。

スマートな方法はないでしょうか?

どのように解決するのですか?

なぜなら、新しいエントリを追加するための十分なスペースがない場合、定期的にリストを大きくしなければならないからです。この点では、サイズが前もって決定され、一度に割り当てられるリスト内包の方が優れています。

しかし、根本的にあなたのアプローチは、すでにデータフレームがあるのに、なぜこれらのユーザーごとに新しいものを作るのか、少し無駄だと思います。

データフレームを列で並べ替えると 'name' で、インデックスをこれに設定し、必要ならカラムを削除しない。

そして、すべてのユニークエントリーのリストを生成し、これらのエントリーを使用してルックアップを実行することができます。また、データを照会するだけなら、コストのかかるデータコピーを行わずに、選択基準を使用してデータフレーム上のビューを返すことができます。

使用方法 pandas.DataFrame.sort_values pandas.DataFrame.set_index :

# sort the dataframe
df.sort_values(by='name', axis=1, inplace=True)

# set the index to be this and don't drop
df.set_index(keys=['name'], drop=False,inplace=True)

# get a list of names
names=df['name'].unique().tolist()

# now we can perform a lookup on a 'view' of the dataframe
joe = df.loc[df.name=='joe']

# now you can query all 'joes'