我正在基于日期合并两个熊猫DataFrame。问题是第二数据框不包括第一数据框的每个日期。我需要使用中的每个日期df1
以及中的最新值df2
。
+-------------+---------------+-------------+
| DataFrame 1 | | |
+-------------+---------------+-------------+
| Date | Sales loc1 | Sales loc2 |
| 1/1/17 | 100 | 95 |
| 1/2/17 | 125 | 124 |
| 1/3/17 | 115 | 152 |
| ... | | |
| 2/1/17 | 110 | 111 |
+-------------+---------------+-------------+
+-------------+---------+------+
| DataFrame 2 | | |
+-------------+---------+------+
| Date | exp | loc |
| 1/1/17 | 100 | 1 |
| 1/1/17 | 125 | 2 |
| 2/1/17 | 115 | 1 |
| 2/1/17 | 110 | 2 |
+-------------+---------+------+
+---------------+---------------+--------------+------------+-------------+
| New Dataframe | | | | |
+---------------+---------------+--------------+------------+-------------+
| Date | Sales loc1 | Sales loc2 | exp loc1 | exp loc2 |
| 1/1/17 | 100 | 95 | 100 | 125 |
| 1/2/17 | 125 | 124 | 100 | 125 |
| 1/3/17 | 115 | 152 | 100 | 125 |
| ... | | | | |
| 2/1/17 | 110 | 111 | 115 | 110 |
+---------------+---------------+--------------+------------+-------------+
df2中的值将用于多个单元格,直到df2中有新值为止。
非常感谢您的宝贵时间。
一个通用解决方案,其中同一日期可以有任意数量的行,这Date
将涉及到:
df1
和df2
使用merge
groupby
+apply
展平数据框rename
和进行一些清理以修复列名称add_prefix
v = df1.merge(df2[['Date', 'exp']])\
.groupby(df1.columns.tolist())\
.exp\
.apply(pd.Series.tolist)
df = pd.DataFrame(v.tolist(), index=v.index)\
.rename(columns=lambda x: x + 1)\
.add_prefix('exp loc')\
.reset_index()
df
Date Sales loc1 Sales loc2 exp loc1 exp loc2
0 1/1/17 100 95 100 125
1 2/1/17 110 111 115 110
如果每个in中只有两行(或者通常恰好是N个)行集,那么这是另一个很好的解决方案。Date
df2
n = 2
v = pd.DataFrame(
df2.exp.values.reshape(-1, n),
index=df2.Date.unique(),
columns=range(1, n + 1)
).add_prefix('exp loc')\
.rename_axis('Date')\
.reset_index()
现在,它只是与df1
on的简单合并Date
。
df1.merge(v, on='Date')
Date Sales loc1 Sales loc2 exp loc1 exp loc2
0 1/1/17 100 95 100 125
1 2/1/17 110 111 115 110
或者,作为@A。Leistra指出,您可能希望使用左外部合并获得不同类型的结果:
df1.merge(v, how='left', on='Date').ffill()
Date Sales loc1 Sales loc2 exp loc1 exp loc2
0 1/1/17 100 95 100.0 125.0
1 1/2/17 125 124 100.0 125.0
2 1/3/17 115 152 100.0 125.0
3 2/1/17 110 111 115.0 110.0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句