pandasデータフレームを再編成して列を新しいヘッダーに変換します。元のヘッダーは既存の列を持つマルチインデックスの一部になります

ジョンアンダーソン

私は、分析のためにかなり大きなデータセットを再編成する任務を負っています。各従業員が、会社に在籍していた期間に基づいて順序付けられた従業員番号に関連付けられた統計のリストを持つデータフレームを作成したいと思います。データは会社の設立までさかのぼらないため、一部の従業員は最初の期間に表示されません。私の推測では、ピボットとマージのいくつかの組み合わせがあり、頭を包むことができません。

df1は次のようになります。

    Periods since Start   Period   Employee Number   Wage   Sick Days  
0                     3   202001               101     20          14  
1                     2   202001               102     15          12  
2                     1   202001               103     10          17  
3                     4   202002               101     20          14  
4                     3   202002               102     20          10  
5                     2   202002               103     10          13  
6                     5   202003               101     25          13  
7                     4   202003               102     20           9  
8                     3   202003               103     10          13  

そして私はdf2が欲しい(参照用の列番号のみ):

Column1   Column2     Column3   Column4   Column5  
                      101       102       103      
      1   Wage        NaN       NaN       10       
      1   Sick Days   NaN       NaN       17       
      2   Wage        NaN       15        10       
      2   Sick Days   NaN       12        13       
      3   Wage        20        20        10       
      3   Sick Days   14        10        13       
      4   Wage        20        20        NaN      
      4   Sick Days   14        9         NaN      

Column1 = '開始からの期間'

Column2 = "Stat"例: '賃金'、 '病欠'

列3-列5ヘッダー= '従業員番号'

最初に考えたのはピボット/マージ/スタックを試すことでしたが、良い結果は得られませんでした。

私が考えた2番目のオプションは、必要なインデックスとヘッダーを使用してデータフレームを作成し、それをdf1から入力することでした。

import pandas as pd

import numpy as np

stat_list = ['Wage', 'Sick Days']

largest_period = df1['Periods since Start'].max()

df2 = np.tile(stat_list, largest_period)

df2 = pd.DataFrame(data=df2, columns = ['Stat']) 

df2['Period_Number'] = df2.groupby('Stat').cumcount()+1

df2 = pd.DataFrame(index = df2[['Period_Number', 'Stat']], 
                 columns = df1['Employee Number'])

どの収量:

Employee Number    101   102   103   
(1, 'Wage')        NaN   NaN   NaN  
(1, 'Sick Days')   NaN   NaN   NaN  
(2, 'Wage')        NaN   NaN   NaN  
(2, 'Sick Days')   NaN   NaN   NaN  
(3, 'Wage')        NaN   NaN   NaN  
(3, 'Sick Days')   NaN   NaN   NaN  
(4, 'Wage')        NaN   NaN   NaN  
(4, 'Sick Days')   NaN   NaN   NaN  

しかし、私はそれをどのように設定するか途方に暮れています。

スコットボストン

これを試してください。最初にmelt、開始からの期間、従業員番号、および期間をインデックスに保持するデータフレーム。次に、pivot「value」を使用して行と列を作成するデータフレームは、ピボットされたデータフレームの値を溶かします。最後に、次を使用してインデックスをクリーンアップしreset_index、列インデックスヘッダー名を削除しますrename_axis

df.melt(['Periods since Start', 'Employee Number', 'Period'])\
  .pivot(['Periods since Start', 'variable'], 'Employee Number', 'value')\
  .reset_index()\
  .rename_axis(None, axis=1)

出力:

   Periods since Start   variable   101   102   103
0                    1  Sick Days   NaN   NaN  17.0
1                    1       Wage   NaN   NaN  10.0
2                    2  Sick Days   NaN  12.0  13.0
3                    2       Wage   NaN  15.0  10.0
4                    3  Sick Days  14.0  10.0  13.0
5                    3       Wage  20.0  20.0  10.0
6                    4  Sick Days  14.0   9.0   NaN
7                    4       Wage  20.0  20.0   NaN
8                    5  Sick Days  13.0   NaN   NaN
9                    5       Wage  25.0   NaN   NaN

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ