根据两个条件联接,合并或重塑数据框

时间:2019-08-13 09:53:14

标签: pandas join merge python-3.5

我有两个要合并或合并的数据框df和df1。

import pandas as pd

df = pd.DataFrame(columns=['lt1', 'lt2','lt3','lt4','lt5','lt6'])
df['date'] = pd.date_range('2016-1-1', periods=5, freq='D')
df
   lt1  lt2  lt3  lt4  lt5  lt6       date
0  NaN  NaN  NaN  NaN  NaN  NaN 2016-01-01
1  NaN  NaN  NaN  NaN  NaN  NaN 2016-01-02
2  NaN  NaN  NaN  NaN  NaN  NaN 2016-01-03
3  NaN  NaN  NaN  NaN  NaN  NaN 2016-01-04
4  NaN  NaN  NaN  NaN  NaN  NaN 2016-01-05

df1 = pd.DataFrame({'location': ['lt1','lt3', 'lt6', 'lt1','lt2', 'lt3'], \
                   'date': ['2016-01-1', '2016-01-02','2016-01-1','2016-01-03','2016-01-5','2016-01-4'], \
                   'counts': ['2', '1','1','1', '3','1']})

df1.date = pd.to_datetime(df1.date)
df1
  counts       date location
0      2 2016-01-01      lt1
1      1 2016-01-02      lt3
2      1 2016-01-01      lt6
3      2 2016-01-03      lt1
4      3 2016-01-05      lt2
5      1 2016-01-04      lt3

我想根据df1中的位置将计数值放入df中。合并将基于date列,但是要添加的值将来自df2.counts列,并且这些值将被正确分配到df中的相应位置名称列中。 df中的列名包含df1.location列中存在的所有名称。

仅按日期进行合并很容易,但是由于它并不是真正的合并,因此更像是重塑或合并。任何建议如何获取以下df作为输出:

df
        date  lt1  lt2  lt3  lt4  lt5  lt6
0 2016-01-01    2    0    0    0    0    1
1 2016-02-01    0    0    1    0    0    0
2 2016-03-01    1    0    0    0    0    0
3 2016-04-01    0    0    1    0    0    0
4 2016-05-01    0    3    0    0    0    0

1 个答案:

答案 0 :(得分:2)

这是使用pivot_tablecombine_first的一种方法:

m=df1.pivot_table(index='date',columns='location',values='counts',aggfunc='sum')
final=df.set_index('date').combine_first(m).fillna(0).reset_index()

或者只是:

(df.set_index('date').combine_first(df1.pivot('date','location','counts'))
                                             .fillna(0).reset_index())

        date lt1 lt2 lt3  lt4  lt5 lt6
0 2016-01-01   2   0   0    0    0   1
1 2016-01-02   0   0   1    0    0   0
2 2016-01-03   1   0   0    0    0   0
3 2016-01-04   0   0   1    0    0   0
4 2016-01-05   0   3   0    0    0   0