【问题标题】:Replace values in specific rows from one DataFrame to another when certain columns have the same values当某些列具有相同的值时,将特定行中的值从一个 DataFrame 替换为另一个 DataFrame
【发布时间】:2023-01-15 02:06:34
【问题描述】:

与其他问题不同,我不想用新值创建一个新列,我想使用同一列,只是将旧值更改为新值(如果存在)。

对于一个新专栏,我会有:

import pandas as pd

df1 = pd.DataFrame(data = {'Name' : ['Carl','Steave','Julius','Marcus'], 
                           'Work' : ['Home','Street','Car','Airplane'],
                           'Year' : ['2022','2021','2020','2019'],
                           'Days' : ['',5,'','']})

df2 = pd.DataFrame(data = {'Name' : ['Carl','Julius'], 
                           'Work' : ['Home','Car'],
                           'Days' : [1,2]})

df_merge = pd.merge(df1, df2, how='left', on=['Name','Work'], suffixes=('','_'))
print(df_merge)
     Name      Work  Year Days  Days_
0    Carl      Home  2022         1.0
1  Steave    Street  2021    5    NaN
2  Julius       Car  2020         2.0
3  Marcus  Airplane  2019         NaN

但我真正想要的是这样的:

     Name      Work  Year Days
0    Carl      Home  2022    1
1  Steave    Street  2021    5
2  Julius       Car  2020    2
3  Marcus  Airplane  2019     

建立这样一个联合的正确方法是什么?

【问题讨论】:

  • 关于合并日期时优先考虑的任何说明?例如,如果我们在 df1 中有 'Days' : [1,5,'',''] 而不是?

标签: python pandas dataframe


【解决方案1】:

您可以使用combine_first,预先将空字符串设置为 NaN(最后的索引是重新排列列以匹配所需的输出):

df1.loc[df1["Days"] == "", "Days"] = float("NaN")
df1.combine_first(df1[["Name", "Work"]].merge(df2, "left"))[df1.columns.values]

这输出:

     Name      Work  Year Days
0    Carl      Home  2022  1.0
1  Steave    Street  2021    5
2  Julius       Car  2020  2.0
3  Marcus  Airplane  2019  NaN

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2021-09-28
    • 1970-01-01
    • 2022-01-06
    • 2018-06-02
    • 2019-05-31
    • 1970-01-01
    • 2021-09-12
    • 2017-02-15
    相关资源
    最近更新 更多