鱼C论坛

 找回密码
 立即注册
查看: 1326|回复: 2

[已解决]关于用数据帧2更新数据帧1的问题,求大师帮忙,谢谢

[复制链接]
发表于 2023-4-7 18:01:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
data1 = [['000008','嘉实中证500ETF联接A','1.8108','1.99','0.38','6.40','11.85','2.95','4.85'],
        ['000042',  '财通中证ESG100指数增强A','1.8939','2.06','','5.68','12.18','','-2.95'],
        ['000051','华夏沪深300ETF联接A',' 1.4392','1.39' , '-0.28','2.66','7.27','-1.96',  ''],
        ['000059','  国联安中证医药100A',' 1.1753','1.41','-1.38','0.72','13.37','-1.73','-13.76']]

df1 = pd.DataFrame(data1,columns=['基金代码','基金名称','周增长率','月增长率','3月增长率','6月增长率','2023-04-04','2023-04-05','2023-04-06'])      

data2 = [['000008','嘉实中证500ETF联接A','5661','','','','881',''],
        ['000045' , '财中证ESG100指数增强A','','772','9992','662','882','-992'],
        ['000051','华夏沪深300ETF联接A','5663','', '9993','663','',  '-993'],
        ['000059','  国联安中证医药100A','','774','','','-884','994']]

df2 = pd.DataFrame(data2,columns=['基金代码','基金名称','周增长率','月增长率','9月增长率','6月增长率','2023-04-04','2023-04-07'])      


用df2更新df1,得到df:

关键字:基金代码  
df2中关键字在df1中没有,则添加到df1下面,列对齐,没有的列则增加到df1列后面
df2中关键字在df1中有,有对应列,则按列对齐更新df1的数据,如果df2没有数据,则保留df1的数据
df2中关键字在df1中有,如果df1没有对应列,则增加df2的列到df1列后面,并填充相对应的数据

想要的结果如下,求代码

     基金代码             基金名称     周增长率  月增长率  3月增长率      6月增长率  2023-04-04 2023-04-05      2023-04-06  9月增长率     2023-04-07
0  000008    嘉实中证500ETF联接A     5661      1.99      0.38          6.40      881          2.95            4.85                    
1  000042  财通中证ESG100指数增强A   1.8939     2.06                    5.68      12.18                      -2.95
2  000051    华夏沪深300ETF联接A     5663      1.39     -0.28           663       7.27       -1.96                        9993        -993  
3  000059     国联安中证医药100A     1.1753     774     -1.38           0.72      -884        -1.73           -13.76                   994
4  000045    财中证ESG100指数增强A             772                       662       882                                    9992       -992
最佳答案
2023-4-7 18:04:16
首先,我们需要合并这两个数据帧,然后根据提供的规则来更新数据。以下是一个简单的示例,实现了你的需求:
import pandas as pd

# 已有的数据帧 df1 和 df2
data1 = [['000008','嘉实中证500ETF联接A','1.8108','1.99','0.38','6.40','11.85','2.95','4.85'],
        ['000042',  '财通中证ESG100指数增强A','1.8939','2.06','','5.68','12.18','','-2.95'],
        ['000051','华夏沪深300ETF联接A',' 1.4392','1.39' , '-0.28','2.66','7.27','-1.96',  ''],
        ['000059','  国联安中证医药100A',' 1.1753','1.41','-1.38','0.72','13.37','-1.73','-13.76']]

df1 = pd.DataFrame(data1,columns=['基金代码','基金名称','周增长率','月增长率','3月增长率','6月增长率','2023-04-04','2023-04-05','2023-04-06'])      

data2 = [['000008','嘉实中证500ETF联接A','5661','','','','881',''],
        ['000045' , '财中证ESG100指数增强A','','772','9992','662','882','-992'],
        ['000051','华夏沪深300ETF联接A','5663','', '9993','663','',  '-993'],
        ['000059','  国联安中证医药100A','','774','','','-884','994']]

df2 = pd.DataFrame(data2,columns=['基金代码','基金名称','周增长率','月增长率','9月增长率','6月增长率','2023-04-04','2023-04-07'])      


# 使用基金代码作为键,将 df1 和 df2 进行左连接
merged_df = pd.merge(df1, df2, on='基金代码', how='left', suffixes=('', '_y'))

# 遍历所有列,用 df2 的数据更新 df1
for col in merged_df.columns:
    if col.endswith('_y'):
        original_col = col[:-2]
        # 使用 df2 的数据更新 df1,如果 df2 中的数据为空,则保留 df1 的数据
        merged_df[original_col].update(merged_df[col].where(merged_df[col].notnull(), merged_df[original_col]))
        # 删除临时列
        merged_df.drop(col, axis=1, inplace=True)

# 将不在 df1 中的新列从 df2 添加到结果数据帧
new_columns = set(df2.columns) - set(df1.columns)
for new_col in new_columns:
    merged_df[new_col] = df2[new_col]

# 将 df2 中不存在的行添加到结果数据帧
merged_df = pd.concat([merged_df, df2[df2['基金代码'].isin(set(df2['基金代码']) - set(df1['基金代码']))]])

# 重置索引并删除旧索引列
merged_df.reset_index(drop=True, inplace=True)

print(merged_df)

这将输出你期望的结果。但请注意,这个解决方案是基于你给出的具体示例,如果有更复杂的场景,可能需要进行相应的调整。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-7 18:04:16 | 显示全部楼层    本楼为最佳答案   
首先,我们需要合并这两个数据帧,然后根据提供的规则来更新数据。以下是一个简单的示例,实现了你的需求:
import pandas as pd

# 已有的数据帧 df1 和 df2
data1 = [['000008','嘉实中证500ETF联接A','1.8108','1.99','0.38','6.40','11.85','2.95','4.85'],
        ['000042',  '财通中证ESG100指数增强A','1.8939','2.06','','5.68','12.18','','-2.95'],
        ['000051','华夏沪深300ETF联接A',' 1.4392','1.39' , '-0.28','2.66','7.27','-1.96',  ''],
        ['000059','  国联安中证医药100A',' 1.1753','1.41','-1.38','0.72','13.37','-1.73','-13.76']]

df1 = pd.DataFrame(data1,columns=['基金代码','基金名称','周增长率','月增长率','3月增长率','6月增长率','2023-04-04','2023-04-05','2023-04-06'])      

data2 = [['000008','嘉实中证500ETF联接A','5661','','','','881',''],
        ['000045' , '财中证ESG100指数增强A','','772','9992','662','882','-992'],
        ['000051','华夏沪深300ETF联接A','5663','', '9993','663','',  '-993'],
        ['000059','  国联安中证医药100A','','774','','','-884','994']]

df2 = pd.DataFrame(data2,columns=['基金代码','基金名称','周增长率','月增长率','9月增长率','6月增长率','2023-04-04','2023-04-07'])      


# 使用基金代码作为键,将 df1 和 df2 进行左连接
merged_df = pd.merge(df1, df2, on='基金代码', how='left', suffixes=('', '_y'))

# 遍历所有列,用 df2 的数据更新 df1
for col in merged_df.columns:
    if col.endswith('_y'):
        original_col = col[:-2]
        # 使用 df2 的数据更新 df1,如果 df2 中的数据为空,则保留 df1 的数据
        merged_df[original_col].update(merged_df[col].where(merged_df[col].notnull(), merged_df[original_col]))
        # 删除临时列
        merged_df.drop(col, axis=1, inplace=True)

# 将不在 df1 中的新列从 df2 添加到结果数据帧
new_columns = set(df2.columns) - set(df1.columns)
for new_col in new_columns:
    merged_df[new_col] = df2[new_col]

# 将 df2 中不存在的行添加到结果数据帧
merged_df = pd.concat([merged_df, df2[df2['基金代码'].isin(set(df2['基金代码']) - set(df1['基金代码']))]])

# 重置索引并删除旧索引列
merged_df.reset_index(drop=True, inplace=True)

print(merged_df)

这将输出你期望的结果。但请注意,这个解决方案是基于你给出的具体示例,如果有更复杂的场景,可能需要进行相应的调整。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-7 18:37:21 | 显示全部楼层
for new_col in new_columns:
    merged_df[new_col] = df2[new_col]

大师,感谢帮助,但还是想麻烦大师把上面这句话完美下,还帮我加点条件,要不会把  “9992       -992”这两个数据,加到第二行,出现有点不对的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 11:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表