簡體   English   中英

Pandas 數據幀比較和替換值

[英]Pandas data frame compare and replace values

我有兩個 pandas 數據幀,如下所示。 “否”列是一個公共字段。 基於“否”,我想替換第一個數據框列“總計”中的值。

條件是:在“否”匹配的地方,從 dataframe2 獲取“Marks1”值並在“Total”列中替換。 如果“Marks1”為 NULL,則獲取“Marks2”值並替換為“Total”。 如果兩者 (Marks1/Marks2) 都是 null,則在“總計”列中替換為 null。 最終結果應該在 data frame1 中。 兩個數據框都有幾十萬條記錄。

Data frame1
No|Total
1234|11
2515|21
3412|32
4854|
7732|53

Data frame2
No|Marks1|Marks2
1234|99|23
2515|98|31
3412||20
4854||98
7732||

Result :
No|Total
1234|99
2515|98
3412|20
4854|98
7732|

使用Series.map將缺失值Marks1替換為Marks2Series.fillna

df = df2.set_index('No')

df1['Total'] = df1['No'].map(df['Marks1'].fillna(df['Marks2']))
print (df1)
     No  Total
0  1234   99.0
1  2515   98.0
2  3412   20.0
3  4854   98.0
4  7732    NaN

如果df2No中可能存在重復值,則使用:

print (df2)
     No  Marks1  Marks2
0  1234    99.0    23.0 <- duplicated No
1  1234    98.0    31.0 <- duplicated No
2  3412     NaN    20.0
3  4854     NaN    98.0
4  7732     NaN     NaN

#newer pandas versions
df = df2.set_index('No').sum(level=0, min_count=1)
#oldier pandas versions
#df = df2.set_index('No').sum(level=0)
print (df)
      Marks1  Marks2
No                  
1234   197.0    54.0<- unique No, values are summed per index created by No
3412     NaN    20.0
4854     NaN    98.0
7732     NaN     NaN

df1['Total'] = df1['No'].map(df['Marks1'].fillna(df['Marks2']))
print (df1)
     No  Total
0  1234  197.0
1  2515    NaN
2  3412   20.0
3  4854   98.0
4  7732    NaN

如果df1df2有相同的索引值並且每個No匹配的值使用:

df1['Total'] = df2['Marks1'].fillna(df2['Marks2'])

您可以在此處使用np.select

m = df2['Marks1'].notna()
m1 = df2['Marks1'].isna() & df2['Marks2'].notna()
condlist = [m,m1]
choice = [df2['Marks1'] , df2['Marks2']]
df1['Total'] = np.select(condlist,choice,np.nan)

     No  Total
0  1234   99.0
1  2515   98.0
2  3412   20.0
3  4854   98.0
4  7732    NaN

暫無
暫無

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

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