从现有数据框架创建python新数据框架



我有一个数据框架在下面给定的格式:

ID_1 Code_M ID_2  Year     PI_code DI_code Sex No_of_PI No_of_DI Days_1 Days_2
1    DM     100   2019_03  p106    di100    2     1        1      100    100
1    DM     100   2019_03  p106    di200    2     1        1      100    100
1    DM     100   2019_03  p106    di300    2     1        1      100    100
1    DM     100   2019_03  p106    di400    2     1        1      100    100  
2    XZ     200   2019_03  p107    di100    2     1        1      200    200
2    XZ     200   2019_03  p107    di200    2     1        1      200    200
2    XZ     200   2019_03  p107    di300    2     1        1      200    200
2    XZ     200   2019_03  p107    di400    2     1        1      200    200

我需要把它转换成下面给定的格式,我得到不同的PI_code的单独列和这些列的值必须是列No_of_PI中存在的值的总和,同样我需要不同的DI_code的单独列和这些列的值必须是存在的值No_of_DI列输出格式如下:

ID_1 Code_M ID_2  Year     P106  P107 di100 di200 di300 di400 Sex Days_1 Days_2
1     DM    100   2019-03   4     Null    1     1     1     1     2   100   100
1     XZ    200   2019-03   Null   4      1     1     1     1     1   200   200

此处P106列中的值4是中P106行对应的所有No_of_PI值的总和对于di100对应的行,PI_code列和di100列中的值等于No_of_DI中present的值1。

也许有更聪明的解决方案,但因为它不是一个简单的枢轴,所以解决方案也不可能那么简单。所以我把溶液分成两部分。

# Part 1 DI values
# pivot table to get the Di_code columns and values
di_pivot=pd.pivot_table(df,index=["ID_1", "Code_M", "ID_2",  "Year" ,"Days_1","Days_2","Sex","PI_code"],
columns=["DI_code"],
values=["No_of_DI"])
di_pivot=di_pivot.reset_index()  
# Add new column names
cols=  ["ID_1", "Code_M", "ID_2",  "Year" ,"Days_1","Days_2","Sex","PI_code"]
cols.extend([x for x in di_pivot.columns.get_level_values(1) if x != ''])
di_pivot.columns = cols
# Part 2 PI values
# Summarize PI_code value then pivot
pi_grouped=df.groupby(by=["ID_1", "Code_M", "ID_2",  "Year","PI_code"], 
as_index=False).agg({"No_of_PI":'sum'})

pi_grouped_pivot=pd.pivot_table(pi_grouped,index=["ID_1", "Code_M", "ID_2",  "Year" ],
columns=["PI_code"],
values=["No_of_PI"])

pi_grouped_pivot=pi_grouped_pivot.reset_index()  

# Add new column names
cols=  ["ID_1", "Code_M", "ID_2",  "Year"]
cols.extend([x for x in pi_grouped_pivot.columns.get_level_values(1) if x != ''])
pi_grouped_pivot.columns = cols

# join the two dataframe
final_df = pi_grouped_pivot.merge(di_pivot, on = ["ID_1", "Code_M", "ID_2",  "Year"])
# The final output format
final_df = final_df[['ID_1', 'Code_M', 'ID_2', 'Year', 'p106', 'p107', 
'di100', 'di200', 'di300', 'di400','Sex', 'Days_1', 'Days_2',]]

最新更新