我有两个如下所示的熊猫数据框。 “否”列是一个公共字段。基于“否”,我想替换第一个数据框列“总计”中的值。
条件为:如果“否”匹配,则从dataframe2获取“ Marks1”值,然后在“总计”列中进行替换。如果'Marks1'为NULL,则获取'Marks2'值并替换为'Total'。如果两个(Marks1 / Marks2)都为空,请在“总计”列中将其替换为空。 最终结果应该在数据帧1中。这两个数据帧都有几十万条记录。
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|
答案 0 :(得分:2)
使用Series.map
并用Series.fillna
用Marks1
替换缺失的值Marks2
:
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
如果No
中df2
中可能有重复的值,请使用:
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
如果df1
和df2
中的索引值相同,并且每个No
值匹配,则使用:
df1['Total'] = df2['Marks1'].fillna(df2['Marks2'])
答案 1 :(得分:1)
您可以在此处使用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