我有两个数据框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
答案 0 :(得分:2)
如果DataFrames
绝对对齐,则可以使用set_index
,stack
和concat
:
(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