合并两个数据框并减少列数

时间:2020-02-10 11:46:21

标签: python pandas dataframe

我有两个数据框df_dates和df_ratios。两个数据框的尺寸均相同,为150 x4。两个数据框都有一个作为安全ID的列,并且这两个数据框中的该列相同。

df_dates
id     col1       col2       col3        col4
1sds   nan        nan        20200108    nan
bhu6   20190404   nan        nan         nan
lm55   nan        nan        20200623    20201215
bn34   nan        nan        nan         nan


df_ratios
id     col1       col2       col3        col4
1sds   nan        nan        1.34        nan
bhu6   2.6        nan        nan         nan
lm55   nan        nan        0.23        0.45
bn34   nan        nan        nan         nan

我需要的如下所示。基本上,在df_dates中有一个日期的地方,在df_ratios中将有一个对应的数字,我想将它们对齐并忽略所有nan。我知道如何解决此问题的唯一方法是简单地遍历数据帧中的每一行和每一列并应用一些简单的逻辑。我想知道在熊猫中是否有更有效的方法?

df_result
id     dates      ratios
1sds   20200108   1.34
bhu6   20190404   2.6
lm55   20200623   0.23        
lm55   20201215   0.45       

3 个答案:

答案 0 :(得分:2)

如果DataFrames绝对对齐,则可以使用set_indexstackconcat

(pd.concat([df_dates.set_index('id').stack().rename('dates'),
            df_ratios.set_index('id').stack().rename('ratios')], axis=1)
 .reset_index(level=0).reset_index(drop=True))

[出]

     id       dates  ratios
0  1sds  20200108.0    1.34
1  bhu6  20190404.0    2.60
2  lm55  20200623.0    0.23
3  lm55  20201215.0    0.45

答案 1 :(得分:1)

IIUC,

如果您的结果订购正确,我们可以融会贯通。

new_df = pd.concat([
    pd.melt(df1, id_vars="id",value_name='month').drop("variable", axis=1),
    pd.melt(df2, id_vars="id",value_name='ratio').drop(["variable","id"], axis=1)
],
axis=1
).dropna()

print(new_df)

      id       month    ratio  
1   bhu6  20190404.0   2.60
8   1sds  20200108.0   1.34
10  lm55  20200623.0   0.23
14  lm55  20201215.0   0.45

答案 2 :(得分:1)

您可以从每个数据帧创建单独的Series对象,然后合并然后在索引上。

s1 = df_dates.set_index('id').stack().astype(int)
s2 = df_ratios.set_index('id').stack()

s1.name = 'dates'
s2.name = 'ratios'

pd.merge(s1, s2, left_index=True, right_index=True).reset_index(level=0)
# returns:
        id     dates  ratios
col3  1sds  20200108    1.34
col1  bhu6  20190404    2.60
col3  lm55  20200623    0.23
col4  lm55  20201215    0.45