futui 发表于 2023-4-7 18:01:36

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

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-069月增长率   2023-04-07
0000008    嘉实中证500ETF联接A   5661      1.99      0.38          6.40      881          2.95            4.85                  
1000042财通中证ESG100指数增强A   1.8939   2.06                  5.68      12.18                      -2.95
2000051    华夏沪深300ETF联接A   5663      1.39   -0.28         663       7.27       -1.96                        9993      -993
3000059   国联安中证医药100A   1.1753   774   -1.38         0.72      -884      -1.73         -13.76                   994
4000045    财中证ESG100指数增强A             772                     662       882                                    9992       -992

isdkz 发表于 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.update(merged_df.where(merged_df.notnull(), merged_df))
      # 删除临时列
      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 = df2

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

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

print(merged_df)

这将输出你期望的结果。但请注意,这个解决方案是基于你给出的具体示例,如果有更复杂的场景,可能需要进行相应的调整。

futui 发表于 2023-4-7 18:37:21

for new_col in new_columns:
    merged_df = df2

大师,感谢帮助,但还是想麻烦大师把上面这句话完美下,还帮我加点条件,要不会把“9992       -992”这两个数据,加到第二行,出现有点不对的情况
页: [1]
查看完整版本: 关于用数据帧2更新数据帧1的问题,求大师帮忙,谢谢