【问题标题】:pandas concat two dataframe while one column concat and another one still keeps?pandas concat 两个数据框,而一列 concat 和另一列仍然保留?
【发布时间】:2020-07-01 08:28:47
【问题描述】:

输入

df1

id      date      v1
a    2020-1-1     1
a    2020-1-2     2
b    2020-1-4     10
b    2020-1-22    30
c    2020-2-4     10
c    2020-2-22    30


df2

id      date      v1
a    2020-1-3     1
b    2020-1-7     12
b    2020-1-22    13
c    2020-2-10    15
c    2020-2-22    60

目标

id      date      v1   v2
a    2020-1-1     1    0
a    2020-1-2     2    0
a    2020-1-3     0    1
b    2020-1-4     10   0
b    2020-1-7     0    12
b    2020-1-22    30   13
c    2020-2-4     10   0
c    2020-2-10     0   15
c    2020-2-22    30   60

详情:

  • 只有两个数据框,对于每个id,日期是唯一的。
  • 基于id 将两个数据帧连接到df,每个id 包含来自两个数据帧的所有日期值
  • 新的合并数据框包含v1和v2列,而df1df2中的日期返回原始值,而仅df1df2之一中的日期返回原始值和0如果日期没有值。

试试
我搜索了合并、合并文档,但找不到答案。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先将列转换为日期时间以按to_datetime 正确排序,然后将DataFrame.merge 与外部连接重命名为df2df2 以避免v1_xv1_y 输出中的列,将缺失值替换为DataFrame.fillna,按DataFrame.sort_values排序输出:

    df1['date'] = pd.to_datetime(df1['date'])
    df2['date'] = pd.to_datetime(df2['date'])
    
    df = (df1.merge(df2.rename(columns={'v1':'v2'}), on=['id','date'], how='outer')
             .fillna(0)
             .sort_values(['id','date']))
    print (df)
      id       date    v1    v2
    0  a 2020-01-01   1.0   0.0
    1  a 2020-01-02   2.0   0.0
    6  a 2020-01-03   0.0   1.0
    2  b 2020-01-04  10.0   0.0
    7  b 2020-01-07   0.0  12.0
    3  b 2020-01-22  30.0  13.0
    4  c 2020-02-04  10.0   0.0
    8  c 2020-02-10   0.0  15.0
    5  c 2020-02-22  30.0  60.0
    

    【讨论】:

    • @Jack - 当然,等一下。
    • 我不知道为什么要使用 astype,因为 v1 和 v2 可能是浮点数。
    • @Jack - 如果应该是浮动只删除.astype({'v1':int, 'v2':int})
    • 我不知道为什么在合并之前使用rename,你能解释一下吗?
    • @Jack - 仅用于避免 v1_xv1_y 列 ;)
    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多