根据日期合并 Pandas Dataframes

use*_*296 5 python dataframe pandas

我希望根据日期合并两个熊猫数据帧。问题是第二个数据框不包括第一个数据框的每个日期。我需要使用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        |
+---------------+---------------+--------------+------------+-------------+
Run Code Online (Sandbox Code Playgroud)

df2 中的值将用于多个单元格,直到 df2 中有新值。

非常感谢您的时间。

cs9*_*s95 3

一个通用的解决方案是,同一日期可以有任意数量的行Date

  1. 一、合并df1df2使用merge
  2. 接下来,使用groupby+apply来展平数据框
  3. 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
Run Code Online (Sandbox Code Playgroud)

如果每个in中只有两组(或者通常恰好是 N 组)行,那么这是另一个解决方案,该解决方案应该可以很好地工作。Datedf2

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()
Run Code Online (Sandbox Code Playgroud)

现在,这只是与df1on 的简单合并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
Run Code Online (Sandbox Code Playgroud)

或者,如@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
Run Code Online (Sandbox Code Playgroud)