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