【问题标题】:Replace rows in one dataframe with another将一个数据框中的行替换为另一个
【发布时间】:2019-06-28 10:45:19
【问题描述】:

我正在尝试将一个数据框中的行的值替换为另一个。

以下是示例代码

import pandas as pd
import numpy as np
from pprint import pprint

raceA = ['r1','r3','r4','r5','r6','r7','r8', 'r9']
qualifierA = ['last','first','first','first','last','last','first','first']
participantA = ['rat','rat','cat','cat','rat','dog','dog','dog']
dfA = pd.DataFrame(
    {'race':raceA,
     'qualifier':qualifierA,
     'participant':participantA

    }
)
pprint(dfA)

raceB = ['r1','r2','r3','r4','r5','r6','r7','r8', 'r9','r10']
qualifierB = ['last',np.nan,np.nan,'first','first','last','last','first','first',np.nan]
participantB = ['rat','rat',np.nan,'cat','cat','rat','dog','dog',np.nan,np.nan]
dfB = pd.DataFrame(
    {'race':raceB,
     'qualifier':qualifierB,
     'participant':participantB

    }
)
pprint(dfB)
dfB.loc[dfB.race.isin(dfA.race), ['qualifier','participant']] = dfA[['qualifier','participant']]
pprint(dfB)

例如在 dfA 中,

r9     first         dog

dfB 包含,

 r9     first         NaN

期望的输出: dfB

r9     first         dog

得到的输出:

r9       NaN         NaN

有人可以调查一下吗?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    将DataFrame.fillna 与数据框一起使用:

    df = dfB.set_index('race').fillna(dfA.set_index('race')).reset_index()
    
    print(df)
      race qualifier participant
    0   r1      last         rat
    1   r2       NaN         rat
    2   r3     first         rat
    3   r4     first         cat
    4   r5     first         cat
    5   r6      last         rat
    6   r7      last         dog
    7   r8     first         dog
    8   r9     first         dog
    9  r10       NaN         NaN
    

    或者使用update:

    dfB = dfB.set_index('race')
    dfA = dfA.set_index('race')
    
    dfB.update(dfA)
    
    print(dfB.reset_index())
     race qualifier participant
    0   r1      last         rat
    1   r2       NaN         rat
    2   r3     first         rat
    3   r4     first         cat
    4   r5     first         cat
    5   r6      last         rat
    6   r7      last         dog
    7   r8     first         dog
    8   r9     first         dog
    9  r10       NaN         NaN
    

    【讨论】:

    • 只是想添加一个建议,如果替换应该是无条件的,也可以使用df.update()而不是df.fillna()。另外我认为OP对第二个代码sn-p感兴趣,也许可以将它带到顶部。
    • @crazyGamer 添加了,但它有点棘手,因为直接更新原数据帧。
    【解决方案2】:

    我会分多个步骤做这样的事情。

    首先我将合并两个数据框 -

    dfB_PreProcessing = dfB.merge(dfA,left_on='race',right_on='race',how="left")
    

    然后清理参与者列 -

    dfB_PreProcessing['participant_x'] = dfB_PreProcessing['participant_x'] .replace(np.nan, '', regex=True)
    dfB_PreProcessing['participant'] = np.where(dfB_PreProcessing['participant_x'] == '', dfB_PreProcessing['participant_y'], dfB_PreProcessing['participant_x'])
    

    然后清理限定符列(如果需要)-

    dfB_PreProcessing['qualifier_x'] = dfB_PreProcessing['qualifier_x'] .replace(np.nan, '', regex=True)
    dfB_PreProcessing['qualifier'] = np.where(dfB_PreProcessing['qualifier_x'] == '', dfB_PreProcessing['qualifier_y'], dfB_PreProcessing['qualifier_x'])*
    

    然后只选择需要的列作为输出df-

    dfB = dfB_PreProcessing.loc[:,['race','qualifier','participant']]
    

    让我知道它是否有效。

    【讨论】:

    • 考虑左合并而不是内合并,这就是打印的第一个表中缺少 r2 和 r10 的原因。
    【解决方案3】:

    如果我没有正确获得它,请纠正我。 如果要更新一行或多列,则可以更新该列的特定索引的值。 例如。 如果我想更新 B 列中的所有行,那么

    df = pd.DataFrame({'A':[1,2,3],'B': [4,5,6]})
    df1 = pd.DataFrame({'B':[7,8,9]})
    df.update(df1)
    pprint(df)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 2017-11-28
      • 1970-01-01
      • 2015-08-05
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多