如何用另一个DataFrame中的项目替换一个DataFrame中的项目?

时间:2018-08-17 18:13:11

标签: python pandas dataframe

我有两个DataFrame:

df = pd.DataFrame({'ID': ['bumgm001', 'lestj001', 
    'tanam001', 'hellj001', 'chacj001']})

df1 = pd.DataFrame({'playerID': ['bumgama01', 'lestejo01',
     'tanakama01', 'hellije01', 'chacijh01'], 
     'retroID': ['bumgm001', 'lestj001', 'tanam001', 'hellj001', 'chacj001']})

OR

   df                                  df1
    ID                      playerID       retroID
'bumgm001'                  'bumgama01'     'bumgm001'
'lestj001'                  'lestejo01'     'lestj001'
'tanam001'                  'tanakama01'    'tanam001'
'hellj001'                  'hellije01'     'hellj001'
'chacj001'                  'chacijh01'     'chacj001'

现在,我实际的DataFrame比这要复杂一些,但是我在这里简化了它,因此可以清楚地知道我要做什么。

我想提取ID中的所有df,并将它们替换为playerID中的相应df1

我最后的df应该看起来像这样:

   df                                 
**ID**                  
'bumgama01'     
'lestejo01'    
'tanakama01'    
'hellije01'     
'chacijh01'     

我尝试使用以下方法进行操作:

for row in df.itertuples(): #row[1] == the retroID column

    playerID = df1.loc[df1['retroID']==row[1], 'playerID']]

    df.loc[df['ID']==row[1], 'ID'].replace(to_replace=
    df.loc[df['ID']==row[1], 'ID'], value=playerID)

代码似乎可以正常运行。但是我在retroID中的df已更改为NaN,而不是正确的playerIDs

这让我感到很困惑,因为它是数据类型问题,但是我对Pandas并不熟悉,无法进一步诊断。

编辑:

不幸的是,我使我的例子过于简单。我进行了编辑,以更好地代表我遇到的问题。我正在尝试在第二个DataFrame中的一个DataFrame中查找项目,然后将第二个Dataframe中相应的行中的项目替换第一个Dataframe中的项目。列的名称不同。

3 个答案:

答案 0 :(得分:2)

您可以将第二个数据框用作替换字典:

to_replace = df1.set_index('retroID')['playerID'].to_dict()
df['retroID'].replace(to_replace, inplace=True)

答案 1 :(得分:1)

根据您的示例,这就是您想要的:

df['ID'] = df1['playerID']

如果数据顺序不正确(df中的行1与df1中的行1不同),请使用

df['ID']=df1.set_index('retroID').reindex(df['ID'])['playerID'].values

第二种方法的信用额度为

输出

      ID
0   bumgama01
1   lestejo01
2  tanakama01
3   hellije01
4   chacijh01

让我知道它是否正确

答案 2 :(得分:0)

好的,我找到了解决方案。事实证明,我的问题是类型问题。我从以下位置更新了代码:

for row in df.itertuples(): #row[1] == the retroID column

    playerID = df1.loc[df1['retroID']==row[1], 'playerID']]

    df.loc[df['ID']==row[1], 'ID'].replace(to_replace=
    df.loc[df['ID']==row[1], 'ID'], value=playerID)

收件人:

for row in df.itertuples(): #row[1] == the retroID column

    playerID = df1.loc[df1['retroID']==row[1], 'playerID']].values[0]

    df.loc[df['ID']==row[1], 'ID'].replace(to_replace=
    df.loc[df['ID']==row[1], 'ID'], value=playerID)

之所以可行,是因为“ playerID”现在是标量对象(由于.values [0]),而不是其他与DataFrame不兼容的其他数据类型。