簡體   English   中英

根據另一個 Pandas DataFrame 中的值替換 Pandas DataFrame 中的缺失值

[英]Replacing missing values in a Pandas DataFrame based on values in another Pandas DataFrame

我需要使用來自另一個 DataFrame 的值替換 Pandas DataFrame 中的缺失值。

df1 = pd.DataFrame({'ID':['1111','2222','3333','4444','5555'],'Test':['T1','T1','T1','T2','T2'], 'Day1': ['P','P','P','P','P'], 'Day2': ['P','P','P','P', 'NaN'], 'Day3':['P','P','NaN','P','NaN'], 'Day4': ['P','P','NaN','P','NaN']})
    ID   Test Day1 Day2 Day3 Day4
0   1111 T1   P    P    P    P
1   2222 T1   P    P    P    P
2   3333 T1   P    P    NaN  NaN
3   4444 T2   P    P    P    P
4   5555 T2   P    NaN  NaN  NaN

df2 = pd.DataFrame({'ID':['3333','5555'], 'Test':['T1','T2'], 'Label': ['OOT-P', 'OOT-T']})
    ID   Test Label
0   3333 T1   OOT-P
1   5555 T2   OOT-T

df1 中 ID=3333 和 test=T1 的 Day3 和 Day4 的 NaN 需要替換為 df2 中的 OOT-P。

df1 中的 Day2、Day3、Day4(ID=5555 和 test=T2 的 NaN 需要替換為 df2 中的 OOT-T。

兩個數據框都將始終具有 ID 和 Test 列,但 df1 中附加列的名稱和數量會發生變化。 例如,df1 可能有 Day1、Day2、Day3、Day4、Day5 列或 Week1、Week2、Week3 列。

您可以將df2重塑為 Series 以fillna df1

需要做一些事情:用實際的浮點NaN替換字符串'NaN' ,臨時將 ID/Test 設置為索引,並臨時轉置數據幀(帶有 Series/dictionary 的fillna僅適用於列)

(df1.replace('NaN', float('nan'))
    .set_index(['ID','Test']).T
    .fillna(df2.set_index(['ID','Test'])['Label'])
    .T.reset_index()
 )

輸出:

     ID Test Day1   Day2   Day3   Day4
0  1111   T1    P      P      P      P
1  2222   T1    P      P      P      P
2  3333   T1    P      P  OOT-P  OOT-P
3  4444   T2    P      P      P      P
4  5555   T2    P  OOT-T  OOT-T  OOT-T

您還可以使用要更改的 ID 以及要將它們更改為的值來制作元組列表。 然后您可以簡單地遍歷 ID 並將 NaN 值替換為您的新值。

IDS_to_Change = df2.ID.values.tolist()

New_Vals = []
for i in range(len(df2.index)):
    New_Vals.append(df2[df2['ID'] == IDS_to_Change[i]].Label[i])

Data_to_Merge = list(zip(IDS_to_Change, New_Vals))

for ids in Data_to_Merge:
    for i in range (len(df1.index)):
        if df1['ID'][i] == ids[0]:
            id_name = ids[0]          
            index = df1[df1['ID'] == id_name].index[0]
            for j in range(len(df1[df1['ID'] == id_name].columns)):
                 if df1[df1['ID'] == id_name].loc[index][j] == 'NaN':
                    df1.iloc[index][j] = ids[1]

輸出:

    ID    Test  Day1    Day2    Day3    Day4
0   1111    T1     P       P       P       P
1   2222    T1     P       P       P       P
2   3333    T1     P       P   OOT-P   OOT-P
3   4444    T2     P       P       P       P
4   5555    T2     P   OOT-T   OOT-T   OOT-T

暫無
暫無

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

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