簡體   English   中英

分組還是合並? 數據框熊貓python

[英]grouping or merging? dataframes pandas python

關於對熊貓進行分組的另一個問題。 目前,我在以下代碼中使用合並功能和堆棧功能對它們進行分組:

import pandas as pd, numpy as np


df = pd.DataFrame({'Type' : ['SS', 'SS', 'SS', 'DD', 'DD', 'FF'],
                'No.' : ['323', '12', '21', '334', '44', '55'],
                'Res' : ['O', 'E', 'O', 'E', 'E', 'O']}).set_index('Type')
df2 = pd.DataFrame({'Type' : ['SS', 'SS', 'TT', 'DD', 'FF'],
                'No.' : ['43', '77', '98', '352', '51'],
                'Res' : ['O', 'O', 'E', 'E', 'O']}).set_index('Type')
Merged=concat([df,df2], axis=0, keys=['Sample1','Sample2']).stack()

print Merged

         Type     
Sample1  SS    No.    323
               Res      O
               No.     12
               Res      E
               No.     21
               Res      O
         DD    No.    334
               Res      E
               No.     44
               Res      E
         FF    No.     55
               Res      O
Sample2  SS    No.     43
               Res      O
               No.     77
               Res      O
         TT    No.     98
               Res      E
         DD    No.    352
               Res      E
         FF    No.     51
               Res      O

有沒有一種分組方法,所以我可以得到類似於以下結果的結果:

      Sample1  Sample 2
      No. Res  No.  Res
Type         
SS    323   O   43   O
       12   E   77   O
       21   O
DD    334   E  352   E
       44   E
FF     55   O   51   O
TT              98   E

您嘗試的幾乎是正確的,您只需要在concat設置axis=1 (並且不需要堆棧)。 但是數據框的問題是您有一個非唯一索引 ,因此concat無法知道如何沿該軸連接兩個數據框(例如,有多個“ SS”)。
一種方法是,例如,將第二級添加到索引以使其唯一(僅適用於pandas 0.13,有關舊版本的解決方法,請參見下文):

df['count'] = df.groupby(df.index).cumcount()
df2['count'] = df2.groupby(df2.index).cumcount()
df = df.set_index('count', append=True)
df2 = df2.set_index('count', append=True)

因此,數據框如下所示:

In [64]: df
Out[64]:
            No. Res
Type count
SS   0      323   O
     1       12   E
     2       21   O
DD   0      334   E
     1       44   E
FF   0       55   O

然后,您只需將axis=1和提供的keys

In [65]: pd.concat([df,df2], axis=1, keys=['Sample1','Sample2'])
Out[65]:
           Sample1      Sample2
               No.  Res     No.  Res
Type count
DD   0         334    E     352    E
     1          44    E     NaN  NaN
FF   0          55    O      51    O
SS   0         323    O      43    O
     1          12    E      77    O
     2          21    O     NaN  NaN
TT   0         NaN  NaN      98    E

您始終可以使用merged.index = merged.index.droplevel(1)再次刪除count

但是,當然,這是否是一個好的解決方案取決於您數據的性質以及您想要進一步處理的數據。


注意: cumcount是一種新方法,僅適用於master(將於0.13版中發布),目前您可以使用以下方法實現此目的:

df = df.reset_index()
df['count'] = df.groupby('Type').apply(lambda x : pd.Series(np.arange(len(x)), x.index))
df.set_index(['Type', 'count'])

您需要使用列multiindex來獲取所需格式的數據:

import pandas as pd, numpy as np

df = pd.DataFrame({'Type' : ['SS1', 'SS2', 'SS3', 'DD1', 'DD2', 'FF1'],
                'No.' : ['323', '12', '21', '334', '44', '55'],
                'Res' : ['O', 'E', 'O', 'E', 'E', 'O']}).set_index('Type')
df2 = pd.DataFrame({'Type' : ['SS1', 'SS2', 'TT1', 'DD1', 'FF1'],
                'No.' : ['43', '77', '98', '352', '51'],
                'Res' : ['O', 'O', 'E', 'E', 'O']}).set_index('Type')


#Add multi index to the two dataframes
df.columns = [["Season 1"]*2, list(df.columns)]

df2.columns =  [["Season 2"]*2, list(df2.columns)]

#Join on their row index
df.join(df2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM