簡體   English   中英

如何在 Pandas 中將多列轉換為單獨的行/值?

[英]How do I convert multiple columns to individual rows/values in pandas?

我確定這個問題已經得到了回答,但不幸的是我不知道如何稱呼這個操作,所以我的搜索失敗了。 它幾乎就像一個反向數據透視表。

假設我有以下工資單數據:

data = [
    {'employee': 1, 'date': '2020-01-04', 'reg': 8, 'ot': 0, 'dt': 0},
    {'employee': 1, 'date': '2020-01-05', 'reg': 4, 'ot': 4, 'dt': 0},
    {'employee': 1, 'date': '2020-01-06', 'reg': 0, 'ot': 0, 'dt': 4},
    {'employee': 2, 'date': '2020-01-04', 'reg': 6, 'ot': 2, 'dt': 0},
    {'employee': 2, 'date': '2020-01-05', 'reg': 3, 'ot': 5, 'dt': 0},
    {'employee': 2, 'date': '2020-01-06', 'reg': 0, 'ot': 4, 'dt': 0},
]

data_df = pd.DataFrame(data)

我需要做的是將每個員工/日期的每個費率('reg'、'ot' 和 'dt')分解為自己的行,其中有一列用於表示費率標簽,一列用於表示小時,保留其他非基於費率的列。 此外,我不希望值為零的任何費率都有一行。 對於上述數據,我希望得到:

result = [
    {'employee': 1, 'date': '2020-01-04', 'rate': 'reg', 'hours': 8},
    {'employee': 1, 'date': '2020-01-05', 'rate': 'reg', 'hours': 4},
    {'employee': 1, 'date': '2020-01-05', 'rate': 'ot', 'hours': 4},
    {'employee': 1, 'date': '2020-01-06', 'rate': 'dt', 'hours': 4},
    {'employee': 2, 'date': '2020-01-04', 'rate': 'reg', 'hours': 6},
    {'employee': 2, 'date': '2020-01-04', 'rate': 'ot', 'hours': 2},
    {'employee': 2, 'date': '2020-01-05', 'rate': 'reg', 'hours': 3},
    {'employee': 2, 'date': '2020-01-05', 'rate': 'ot', 'hours': 5},
    {'employee': 2, 'date': '2020-01-06', 'rate': 'ot', 'hours': 4},
]

result_df = pd.DataFrame(result)

關於如何實現這一點的任何想法將不勝感激!

嘗試使用melt

(data_df.melt(['employee','date'], 
             var_name='rate', 
             value_name='hours')
        .query('hours != 0'))

輸出:

    employee        date rate  hours
0          1  2020-01-04  reg      8
1          1  2020-01-05  reg      4
3          2  2020-01-04  reg      6
4          2  2020-01-05  reg      3
7          1  2020-01-05   ot      4
9          2  2020-01-04   ot      2
10         2  2020-01-05   ot      5
11         2  2020-01-06   ot      4
14         1  2020-01-06   dt      4

這應該可以解決問題:

data_df=data_df.set_index(["employee", "date"]).stack().reset_index().rename(columns={"level_2": "rate", 0: "hours"})

輸出:

    employee        date rate  hours
0          1  2020-01-04  reg      8
1          1  2020-01-04   ot      0
2          1  2020-01-04   dt      0
3          1  2020-01-05  reg      4
4          1  2020-01-05   ot      4
5          1  2020-01-05   dt      0
6          1  2020-01-06  reg      0
7          1  2020-01-06   ot      0
8          1  2020-01-06   dt      4
9          2  2020-01-04  reg      6
10         2  2020-01-04   ot      2
11         2  2020-01-04   dt      0
12         2  2020-01-05  reg      3
13         2  2020-01-05   ot      5
14         2  2020-01-05   dt      0
15         2  2020-01-06  reg      0
16         2  2020-01-06   ot      4
17         2  2020-01-06   dt      0

暫無
暫無

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

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