簡體   English   中英

使用條件列從另一個框架更新 Pandas dataframe 列

[英]Update Pandas dataframe column from another frame using a conditional column

我有一個主要的 dataframe 我想使用更新框架定期更新。 主框架有一個列,用於確定更新列中的哪一列進行更新。 目前,我可以這樣做:

import pandas as pd
import numpy as np

##### Test data
# Not unique Name but still index
df_main = pd.DataFrame({
        "Name": ["a", "b", "c", "b", "d"],
        "Flip": [True, True, False, False, True],
        "Value": [1.0, 2.0, 3.0, 2.5, 4.0]
    }, columns=["Name", "Flip", "Value"])
df_main.set_index('Name', inplace=True)

#        Flip  Value
# Name              
# a      True    1.0
# b      True    2.0
# c     False    3.0
# b     False    2.5
# d      True    4.0

# Unique index
df_update_data = pd.DataFrame({
        "Name": ["a", "b", "c", "d", "f"],
        "Value_True":  [1.1, 2.1, 3.1, 4.1, 5.1],
        "Value_False": [1.2, 2.2, 3.2, 4.2, 5.2]
    }, columns=["Name", "Value_True", "Value_False"])
df_update_data.set_index('Name', inplace=True)

#       Value_True  Value_False
# Name                         
# a            1.1          1.2
# b            2.1          2.2
# c            3.1          3.2
# d            4.1          4.2
# f            5.1          5.2

df_main = df_main.join(df_update_data, how='inner')
df_main["Value"] = np.where(df_main['Flip'].values, df_main['Value_True'].values, df_main['Value_False'].values)
df_main = df_main.drop(['Value_True', 'Value_False'], axis=1)

print(df_main)
#        Flip  Value
# Name              
# a      True    1.1
# b      True    2.1
# b     False    2.2
# c     False    3.2
# d      True    4.1

這經常發生,我實際上有 Name_{1,2,3}, Flop_{1,2,3}, Value_{1,2,3} 所以我做了 3 次加入、更新和刪除。 我正在努力提高效率,因為我在追逐時間。 這是最好的方法嗎? 我並沒有真正發現使用合並而不是加入來提高速度。

請注意,您的結果是按索引排序的,因此我的解決方案從顯式排序(在索引上)開始。

我認為,創建中間 DataFrame 是不可避免的。 但是您可以計算Value列的值並將它們保存在此列中。

我還注意到how='left' (默認)工作得更快一些,在你的情況下也是可以接受的。

所以代碼可以是:

df_main.sort_index(inplace=True)
wrk = df_main.join(df_update_data)
df_main.Value = np.where(wrk.Flip, wrk.Value_True, wrk.Value_False)

至少您避免刪除 2 列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM