0

コードは次のとおりです。入力データフレームは次のとおりです。 ここに画像の説明を入力

import pandas as pd 
import numpy as np
df = pd.DataFrame([('bird', 'Falconiformes', 2),
                      ('bird', 'Psittaciformes', 4),
                      ('mammal', 'Carnivora', 8),
                     ('mammal', 'Primates', np.nan),
                    ('mammal', 'Carnivora', 12)],
                     index=['falcon', 'parrot', 'lion', 'monkey', 'leopard'],
                    columns=('class', 'order', 'count'))

unique_class= df['class'].unique().tolist()
temp_list = []
for i in range(len(unique_class)):         
    temp =df[df['class']==unique_class[i]].reset_index(drop=True)
    pipe_values= temp['order'].values.tolist()
    count_values=temp['count'].values.tolist()
    Stri= "|".join(pipe_values)
    for j in range(len(pipe_values)):
        df1=temp[:1]
        df1['order']=  Stri         
        df1['count'+str(j)]=count_values[j]
        
    
    temp_list.append(df1)
    final = pd.concat(temp_list)
    final

出力は ここに画像の説明を入力

問題は、巨大なデータが来るときです-約100万-プロセスが遅いです.pandasに他に実行できるロジックまたは組み込み関数はありますか?また、vaexライブラリを使用してそれを行うにはどうすればよいですか?

4

1 に答える 1

2

Pandas 内で実行できます (この方法でデータを組み合わせる必要がある理由がわかりません)。

でグループ化しclass、すべてを文字列に変換し、python の で集計しますstr.join

temp = df.set_index('class').astype(str).groupby(level=[0]).agg("|".join)

count個々の列に分割し、次のように再結合しtempます:

 anoda = (temp['count'].str.split("|", expand=True)
                       .astype(float)
                       .add_prefix('count')
          )

temp.join(anoda).drop(columns='count')


                               order  count0  count1  count2
class                                                       
bird    Falconiformes|Psittaciformes     2.0     4.0     NaN
mammal  Carnivora|Primates|Carnivora     8.0     NaN    12.0
于 2021-08-12T08:43:19.450 に答える