【问题标题】:Pandas: concatenate multilevel index such that the other Dataframe has different sortingPandas:连接多级索引,使另一个 Dataframe 具有不同的排序
【发布时间】:2020-02-13 09:01:08
【问题描述】:

假设您有以下两个数据框 dfsdf1

dfs 由

定义
dfs=pd.DataFrame({
    'Year':[2006, 2006, 2006, 2006, 2006], 
    'Provider':list('abcsd'),
    'Accepted': [2570, 1020, 2140, 120, 15]
 }) 

dfs=dfs.groupby(['Year', 'Provider']).sum()

df1 由

定义
df1=pd.DataFrame({
    'Year':[2006, 2006, 2006, 2006, 2006], 
    'Provider':list('aabbc'),
    'Gender': list('mfmfm'),
    'Accepted app': ['990', '1180', '435', '405', '985']
 })

我想合并这两个数据框以获得类似的东西

df2=pd.DataFrame({
    'Year':[2006, 2006, 2006, 2006, 2006,2006, 2006, 2006, 2006, 2006], 
    'Provider':list('abcsdabcsd'),
    'Accepted': [2570, 1020, 2140, 120, 15,2570, 1020, 2140, 120, 15],
    'Gender': ['m', 'm', 'm', 'Nan', 'Nan', 'f', 'f', 'Nan', 'Nan', 'Nan'],
    'Accepted app': ['990', '435', '985', 'Nan', 'Nan','1180', '405', 'Nan', 'Nan', 'Nan']

 }) 

我不知道如何保留dfs 的多级索引或如何合并它们。

【问题讨论】:

    标签: python-3.x pandas indexing multi-level


    【解决方案1】:

    您可以通过 concat 的唯一值 Gender 重复行,使用 DataFrame.reset_index,然后使用带有左连接的 merge

    df = (pd.concat([dfs.assign(Gender=c) for c in df1['Gender'].unique()])
            .reset_index()
            .merge(df1, on=['Provider','Year','Gender'], how='left'))
    print (df)
       Year Provider  Accepted Gender Accepted app
    0  2006        a      2570      m          990
    1  2006        b      1020      m          435
    2  2006        c      2140      m          985
    3  2006        d        15      m          NaN
    4  2006        s       120      m          NaN
    5  2006        a      2570      f         1180
    6  2006        b      1020      f          405
    7  2006        c      2140      f          NaN
    8  2006        d        15      f          NaN
    9  2006        s       120      f          NaN
    

    如果还想将Gender 列设置为缺失值,可以通过DataFrame.merge 中的indicator=True 参数识别新行的来源,然后用缺失值替换:

    df = (pd.concat([dfs.assign(Gender=c) for c in df1['Gender'].unique()])
            .reset_index()
            .merge(df1, on=['Provider','Year','Gender'], how='left', indicator=True)
            .assign(Gender=lambda x: x['Gender'].mask(x['_merge'].eq('left_only')))
            .drop('_merge', axis=1))
    
    print (df)
       Year Provider  Accepted Gender Accepted app
    0  2006        a      2570      m          990
    1  2006        b      1020      m          435
    2  2006        c      2140      m          985
    3  2006        d        15    NaN          NaN
    4  2006        s       120    NaN          NaN
    5  2006        a      2570      f         1180
    6  2006        b      1020      f          405
    7  2006        c      2140    NaN          NaN
    8  2006        d        15    NaN          NaN
    9  2006        s       120    NaN          NaN
    

    【讨论】:

      猜你喜欢
      • 2018-10-15
      • 1970-01-01
      • 2021-02-22
      • 2018-06-24
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 2017-09-02
      • 2021-12-01
      相关资源
      最近更新 更多