简体   繁体   English

Python Pandas 合并跨 2 个数据帧的行索引和列索引

[英]Python Pandas merge on row index and column index across 2 dataframes

Am trying to do something where I calculate a new dataframe which is dataframe1 divided by dataframe2 where columnname match and date index matches bases on closest date nonexact match)我正在尝试做一些事情,我计算一个新的 dataframe 这是 dataframe1 除以 dataframe2 其中列名匹配和日期索引匹配基于最接近的日期非精确匹配)

idx1 = pd.DatetimeIndex(['2017-01-01','2018-01-01','2019-01-01'])
idx2 = pd.DatetimeIndex(['2017-02-01','2018-03-01','2019-04-01'])
df1 = pd.DataFrame(index = idx1,data = {'XYZ': [10, 20, 30],'ABC': [15, 25, 30]})
df2 = pd.DataFrame(index = idx2,data = {'XYZ': [1, 2, 3],'ABC': [3, 5, 6]})

#looking for some code
#df3 = df1/df2 on matching column and closest matching row

This should produce a dataframe which looks like this这应该产生一个看起来像这样的 dataframe

           XYZ  ABC
2017-01-01  10  5
2018-01-01  10  5
2019-01-01  10  5

You can use an asof merge to do a match on a "close" row.您可以使用asof合并在“关闭”行上进行匹配。 Then we'll group over the columns axis and divide.然后我们将在列轴上分组并划分。

df3 = pd.merge_asof(df1, df2, left_index=True, right_index=True,
                    direction='nearest')
#            XYZ_x  ABC_x  XYZ_y  ABC_y
#2017-01-01     10     15      1      3
#2018-01-01     20     25      2      5
#2019-01-01     30     30      3      6

df3 = (df3.groupby(df3.columns.str.split('_').str[0], axis=1)
           .apply(lambda x: x.iloc[:, 0]/x.iloc[:, 1]))
#            ABC   XYZ
#2017-01-01  5.0  10.0
#2018-01-01  5.0  10.0
#2019-01-01  5.0  10.0

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM