合并两个数据帧并保留公共值,同时保留基于另一列的值

2024-09-26 18:15:23 发布

您现在位置:Python中文网/ 问答频道 /正文

当我合并两个数据帧时,它会保留来自左侧和右侧数据帧的列 加上x和y。 但我希望它成为一列,并“合并”两列的值,以便:

  1. 当值相同时,它只会将该值
  2. 当值不同时,它会根据另一个名为“日期”的列保留值 并采用基于日期的“最新”值

我还尝试了使用concatenate,在本例中,它确实“合并”了两列,但它似乎只是“附加”了两行

例如,在下面的代码中,我希望获得所需的数据帧df_作为输出。我怎么能得到这个

import pandas as pd
import numpy as np

np.random.seed(30)

company1 = ('comA','comB','comC','comD')
df1 = pd.DataFrame(columns=None)
df1['company'] = company1
df1['clv']=[100,200,300,400]
df1['date'] = [20191231,20191231,20191001,20190931]
print("\ndf1:")
print(df1)

company2 = ('comC','comD','comE','comF')
df2 = pd.DataFrame(columns=None)
df2['company'] = company2
df2['clv']=[300,450,500,600]
df2['date'] = [20191231,20191231,20191231,20191231]

print("\ndf2:")
print(df2)

df_desired = pd.DataFrame(columns=None)
df_desired['company'] = ('comA','comB','comC','comD','comE','comF')
df_desired['clv']=[100,200,300,450,500,600]
df_desired['date'] = [20191231,20191231,20191231,20191231,20191231,20191231]
print("\ndf_desired:")
print(df_desired)

df_merge = pd.merge(df1,df2,left_on = 'company',
        right_on = 'company',how='outer')
print("\ndf_merge:")
print(df_merge)
# alternately
df_concat = pd.concat([df1, df2], ignore_index=True, sort=False)
print("\ndf_concat:")
print(df_concat)

Tags: columns数据nonedataframedfmergecompanypd
1条回答
网友
1楼 · 发布于 2024-09-26 18:15:23

一种方法是concat两个数据帧,然后根据公司对date上连接的数据帧进行升序排序,并删除重复条目(,同时保留最新条目):

df = pd.concat([df1, df2])
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d', errors='coerce')
df = df.sort_values('date', na_position='first').drop_duplicates('company', keep='last', ignore_index=True)

结果:

  company  clv       date
0    comA  100 2019-12-31
1    comB  200 2019-12-31
2    comC  300 2019-12-31
3    comD  450 2019-12-31
4    comE  500 2019-12-31
5    comF  600 2019-12-31

相关问题 更多 >

    热门问题