質問の説明方法がわからないので、ここで例を示します。
A B
1 3
1 4
2 5
2 8
2 6
3 6
3 8
4 10
4 1
データフレームには2つの列AとBがあります。このようなリストを返すようにします。
[[3,4],[5,8,6],[6,8],[10,1]]
ご覧のとおり、これはグループ化されA
、B
列に数値のリストを返します。注意すべき点として、要素の順序は変更されB
ません。また、サブリストの順序は列Aに示されているものと同じです([3,4]
グループ1[5,8,6]
から、グループ2からなど)。
データフレームがすでにAによって順序付けられているとします。forループを使用してそれを行う方法は知っていますが、私のデータセットには10億のレコードがあります。だから私はこの問題のためのいくつかの効率的でクリーンなコードを探しています。
最初に最初の列A
でグループ化し、次にで一意の値を取得する必要がありますB
(一意の値のみが必要であり、重複は必要ないと仮定します)。それが終わったら、ラムダ式を使用して各np.array値をリストに変換し、結果のシリーズをを使用してリストに変換し.tolist()
ます。
>>> df.groupby('A', sort=False)['B'].apply(list).tolist()
または、
>>> [list(v) for v in df.groupby('A', sort=False)['B'].unique()]
または、
>>> df.groupby('A', sort=False)['B'].apply(lambda x: x.unique().tolist()).tolist()
[[3, 4], [5, 8, 6], [6, 8], [10, 1]]
また、groupby操作をソートしないことをお勧めします。
興味のある方のために、タイミングを比較します。
df_ = pd.concat([df] * 10000) # Set-up larger dataframe with 90k rows.
%timeit df_.groupby('A', sort=False)['B'].unique().apply(list).tolist()
# 100 loops, best of 3: 5.9 ms per loop
%timeit df_.groupby('A', sort=False)['B'].apply(list).tolist()
# 100 loops, best of 3: 6.79 ms per loop
%timeit list(map(list, df_.groupby('A', sort=False)['B'].apply(list)))
# 100 loops, best of 3: 8.02 ms per loop
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加