【问题标题】:Pandas data frame compare and replace valuesPandas 数据框比较和替换值
【发布时间】:2020-06-09 11:47:07
【问题描述】:

我有两个如下所示的熊猫数据框。 “否”列是一个公共字段。基于“否”,我想替换第一个数据框列“总计”中的值。

条件是:如果匹配“否”,则从 dataframe2 获取“Marks1”值并替换为“Total”列。如果“Marks1”为 NULL,则获取“Marks2”值并替换为“Total”。如果 (Marks1/Marks2) 都为空,则在“总计”列中替换为空。 最终结果应该在 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|

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    使用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
    

    如果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
    

    如果df1df2 中有相同的索引值并且每个No 值匹配使用:

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

    【讨论】:

    【解决方案2】:

    您可以在此处使用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
    

    【讨论】:

    • 我想你忘了包括 condlistchioce
    • 嗨,我收到错误消息:AttributeError: 'Series' object has no attribute 'notna'
    • @RK。你需要升级你的熊猫版本。 .notna, isna, notnull 都是从pandas 0.21.0添加的
    • 我升级到 pandas 0.22 并尝试。当 np.select 遇到以下错误时: raise ValueError('Length of values does not match length of ''index') ValueError: Length of values does not match length of index
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多