【问题标题】:Multiple data frames - Wide to long using pandas多个数据帧 - 使用熊猫从宽到长
【发布时间】:2020-06-17 14:42:30
【问题描述】:

我有两个如下图所示的数据框

df1 = pd.DataFrame({'person_id': [11, 21, 31, 41, 51],
                        'date_1': ['12/30/1961', '05/29/1967', '02/03/1957', '7/27/1959', '01/13/1971'],
                        'date_2': ['07/23/2017','05/29/2017','02/03/2015',np.nan,np.nan]})

df2 = pd.DataFrame({'person_id': [11,11,11,21,31],
                    'visit_id':['A1','A2','A3','B1','B2'],
                    'date_start': ['01/01/2012', '02/25/2017', '02/03/2015', '07/27/2016', '01/13/2011'],
                    'date_end': ['05/03/2012','05/29/2017','03/03/2015','08/15/2016','02/13/2011']})

我尝试了以下。 我只想要长格式的日期列

df = pd.merge(df1, df2, on='person_id',how='outer')
df = pd.wide_to_long(df, stubnames=['date'], i='person_id', j='grp').sort_index(level=0)
df = df.reset_index(level=1, drop=True).reset_index()
df

但这给出了一个空的数据框。

我想获取每个科目的所有日期,如下所示(2 个科目的示例输出)

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    这只是meltconcat

    (pd.concat([df1.melt('person_id', value_name='dates'), 
                df2.melt('person_id',value_vars=['date_start','date_end'], value_name='dates')
              ])
       .drop('variable', axis=1)
       .sort_values('person_id')
    )
    

    【讨论】:

    • 当我输入 reset_index 时,为什么我看到 index 列正在创建而不是重新编号索引
    • 我这样做了(pd.concat([df1.melt('person_id', value_name='dates'), df2.melt('person_id',value_vars=['date_start','date_end'], value_name='dates') ]) .drop('variable', axis=1) .sort_values('person_id').reset_index() )
    • reset_index(drop=True) 不会创建 index 列。
    • 好的,所以当我们希望指定列名时,我们应该在melt 函数中使用value_vars 参数。否则它将考虑所有列。我说的对吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 2017-07-07
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多