如何在不合并的情况下替换仅有几列的行中的值

2024-06-16 14:52:56 发布

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

我有一个df1有将近10万行,另一个df2只有大约10行。我需要将df1中的值替换为df2,以便在两个列值的精确匹配上仅使用30行

df1:
Daily_No     Date      Name      Type       Amount     
   A12    30/01/2020    Bob       R           400        
   A14    30/01/2020    Jacob     R           1000       
   B01    31/01/2020    John      D           20         

df2:
Old_Date       New_Date       Daily_No       Type       Amount     Balance
30/01/2020    05/02/2020         A12           R         10000         0
30/01/2020    06/02/2020        KO11           D          200         10
10/08/2020    06/02/2020        B01            D          5           0

我想将df1列[Daily_No, **Date**, Name, Type, Amount]分别替换为行值[Daily_No, **New_Date**, '' , Type , Amount]中的值,换句话说,复制新的left_on=['Date', 'Daily_No'], right_on=['Old_Date', 'Daily_No']日期和其他详细信息(余额和旧的^{U日期除外:因为余额不在df1中,df1中的日期将被新的^}替换为日期和其他匹配的列

由于df2中只有10行,有没有更快的方法在匹配两列时复制列值

期望输出

Daily_No     Date      Name   Type    Amount     
   A12    05/02/2020    Bob    R      10000 <---df2 row 1 match(replaced Date with New_Date, Type, Amount)
   A14    30/01/2020    Jacob  R      1000 <---df2 no matches
   B01    31/01/2020    John   D        20  <---df2 date didn't match

Tags: nonamenewdatetypeamountdailybob
1条回答
网友
1楼 · 发布于 2024-06-16 14:52:56

IIUC,您可以使用combine_first,因为您不想合并

df3 = df2.rename(columns={"Old_Date": "Date"}).set_index(["Date", "Daily_No"])[["Amount"]]\
    .combine_first(
    df1.set_index(['Date','Daily_No'])).dropna().reset_index()

print(df3)

         Date Daily_No   Amount   Name Type
0  30/01/2020      A12  10000.0    Bob    R
1  30/01/2020      A14   1000.0  Jacob    R
2  31/01/2020      B01     20.0   John    D

另一种方法是基于共同列,ffill&;删除重复项,仅保留后面的值

df3 = pd.concat([df1,
       df2.rename(columns={'Old_Date': 'Date'})[['Date','Amount','Daily_No']]

      ],axis=0,sort=False)

df3.fillna(df3.groupby(['Daily_No','Date'],
            sort=False).ffill()).dropna().drop_duplicates(subset=['Daily_No','Date'],keep='last')

print(df3)


  Daily_No        Date   Name Type  Amount
1      A14  30/01/2020  Jacob    R    1000
2      B01  31/01/2020   John    D      20
0      A12  30/01/2020    Bob    R   10000

相关问题 更多 >