Pandas 将多个相关列组合成单独的组

我有一个看起来像这样的熊猫数据框:

http://img4.mukewang.com/646323850001982606550178.jpg

我想把它转换成这种格式:

http://img3.mukewang.com/6463238e000165e103210157.jpg

在 Pandas 中执行此操作的合适技术是什么?


要在第一张图片中生成原始数据帧,您可以使用以下数据。使用此数据生成数据框


import pandas as pd

df=pd.DataFrame.from_dict(data_dict)



data_dict = {'female_count': {0: 65.0, 1: 13.0, 2: 51.0, 3: 19.0, 4: 53.0, 5: 146.0},

 'jobTitle': {0: 'Associate',

              1: 'Intern',

              2: 'Key Holder',

              3: 'Retail Store Manager',

              4: 'Seasonal Sales Associate',

              5: 'other_jobTitles'},

 'male_count': {0: 44.0, 1: 17.0, 2: 32.0, 3: 6.0, 4: 26.0, 5: 125.0},

 'mean_z_score_female': {0: 0.0,

                         1: 0.0,

                         2: -0.352017669928334,

                         3: 0.08210979257229986,

                         4: -0.10918109741978921,

                         5: 0.23156942728286573},

 'mean_z_score_male': {0: -0.04759213253110343,

                       1: 0.0,

                       2: -0.28872649090170965,

                       3: -0.0027563646918771063,

                       4: 0.0,

                       5: 0.6133138806146933}}


FFIVE
浏览 204回答 5
5回答

肥皂起泡泡

这里有一个使用 `concat' 的相当简单的方法:f = df[["jobTitle", "female_count", "mean_z_score_female"]].rename(columns = {"female_count": "count",                                                                           "mean_z_score_female": "mean_z_score"})\.assign(gender="female")m = df[["jobTitle", "male_count", "mean_z_score_male"]].rename(columns = {"male_count": "count",                                                                           "mean_z_score_male": "mean_z_score"})\.assign(gender="male")pd.concat([m, f]).sort_values("jobTitle")输出是:                   jobTitle  count  mean_z_score  gender0                 Associate   44.0     -0.047592    male0                 Associate   65.0      0.000000  female1                    Intern   17.0      0.000000    male1                    Intern   13.0      0.000000  female2                Key Holder   32.0     -0.288726    male2                Key Holder   51.0     -0.352018  female3      Retail Store Manager    6.0     -0.002756    male3      Retail Store Manager   19.0      0.082110  female4  Seasonal Sales Associate   26.0      0.000000    male4  Seasonal Sales Associate   53.0     -0.109181  female5           other_jobTitles  125.0      0.613314    male5           other_jobTitles  146.0      0.231569  female

幕布斯7119047

这是的工作pd.wide_to_long,但您首先必须重命名某些列,即female_countandmale_count和:count_femalecount_maledf.columns = ["_".join(entry.split("_")[::-1])           if "count" in entry else entry           for entry in df]          ]print(df.columns)Index(['count_female', 'jobTitle', 'count_male', 'mean_z_score_female',   'mean_z_score_male'],  dtype='object')print (pd.wide_to_long(df, stubnames=["count","mean_z_score"],                       i="jobTitle",j="gender", sep="_", suffix="\w+"))                                 count  mean_z_scorejobTitle                 gender                     Associate                female   65.0      0.000000Intern                   female   13.0      0.000000Key Holder               female   51.0     -0.352018Retail Store Manager     female   19.0      0.082110Seasonal Sales Associate female   53.0     -0.109181other_jobTitles          female  146.0      0.231569Associate                male     44.0     -0.047592Intern                   male     17.0      0.000000Key Holder               male     32.0     -0.288726Retail Store Manager     male      6.0     -0.002756Seasonal Sales Associate male     26.0      0.000000other_jobTitles          male    125.0      0.613314

慕妹3146593

这是一个与 Roy2012 非常相似的答案,它使用append:df_new = Nonefor gender in ['male','female']:  df_gender = (df[['jobTitle',f'{gender}_count',f'mean_z_score_{gender}']]               .rename(columns = {f'{gender}_count':'count',                                  f'mean_z_score_{gender}': 'mean_z_score'}))  df_gender['gender'] = gender  df_new = df_gender if df_new is None else df_new.append(df_gender)df_new = df_new.sort_values(by=['jobTitle','gender'],                            axis=0).reset_index(drop=True)print(df_new)输出是:                    jobTitle  count  mean_z_score  gender0                  Associate   65.0      0.000000  female1                  Associate   44.0     -0.047592    male2                     Intern   13.0      0.000000  female3                     Intern   17.0      0.000000    male4                 Key Holder   51.0     -0.352018  female5                 Key Holder   32.0     -0.288726    male6       Retail Store Manager   19.0      0.082110  female7       Retail Store Manager    6.0     -0.002756    male8   Seasonal Sales Associate   53.0     -0.109181  female9   Seasonal Sales Associate   26.0      0.000000    male10           other_jobTitles  146.0      0.231569  female11           other_jobTitles  125.0      0.613314    male

慕莱坞森

pd.melt(df,  id_vars=['jobTitle','mean_z_score_female','mean_z_score_male'],         value_vars=['female_count', 'male_count'], var_name="gender", value_name='count').melt(    id_vars=['jobTitle', 'gender','count'],value_vars=['mean_z_score_female','mean_z_score_male'],     value_name='mean_z_score').drop('variable', axis=1)

慕慕森

这是另一种使用方式lreshape:newdf=pd.lreshape(df,{'count': ['female_count', 'male_count'],'mean_z_score': ['mean_z_score_female', 'mean_z_score_male']})\        .sort_values('jobTitle')newdf['genre']=['female','male']*(len(newdf)//2)输出:newdf                    jobTitle  count  mean_z_score   genre0                  Associate   65.0      0.000000  female6                  Associate   44.0     -0.047592    male1                     Intern   13.0      0.000000  female7                     Intern   17.0      0.000000    male2                 Key Holder   51.0     -0.352018  female8                 Key Holder   32.0     -0.288726    male3       Retail Store Manager   19.0      0.082110  female9       Retail Store Manager    6.0     -0.002756    male4   Seasonal Sales Associate   53.0     -0.109181  female10  Seasonal Sales Associate   26.0      0.000000    male5            other_jobTitles  146.0      0.231569  female11           other_jobTitles  125.0      0.613314    male注意:lreshape目前没有记录,可能会被删除。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python