Python比较数据框内容,如果匹配则替换?

时间:2018-12-18 17:51:12

标签: python dataframe comparison equals

我正在使用python进行实践的小型程序,需要一些帮助来尝试比较数据帧中的两列并将另一列的内容替换。将数据框转换为excel后,可以看到结果。

无论如何,我想根据每列的前三个字母比较两列LocationAbbrev,然后用缩写代替。因此,应将LON列中的Abbrev伦敦中的前三个字母进行比较。 Abbrev列仅给出一个缩写实例。

所以我开始:

Team         Location    GameDay   Abbrev
Arsenal      London      2/14      LON
Liverpool    Liverpool   2/14      LIV
Manchester   Manchester  2/16      MAN
Arsenal      London      2/23      NEW
Newcastle    Manchester  2/16      LEE

我想得到这个输出:

Team        Location  GameDay   Abbrev
Arsenal     LON       2/14      LON
Liverpool   LIV       2/14      LIV
Manchester  MAN       2/16      MAN
Arsenal     LON       2/23      NEW
Newcastle   MAN       2/16      LEE

但是,现在无论匹配如何,我都只能完全替换这些列。

Team        Location    GameDay   Abbrev
Arsenal     LON         2/14      LON
Liverpool   LIV         2/14      LIV
Manchester  MAN         2/16      MAN
Arsenal     NEW         2/23      NEW
Newcastle   LEE         2/16      LEE

这是我拥有的代码。

df['Location'] = df.apply(lambda row: row['Abbrev'] 
                          if row['Location'][:3].upper() != row['Abbrev'] 
                          else row['Abbrev'],axis=1)

我想帮助找出我的代码有什么问题。

2 个答案:

答案 0 :(得分:0)

您需要检查row['Location'][:3]是否为缩写:

import pandas as pd

data = [['Arsenal', 'London', '2/14', 'LON'],
        ['Liverpool', 'Liverpool', '2/14', 'LIV'],
        ['Manchester', 'Manchester', '2/16', 'MAN'],
        ['Arsenal', 'London', '2/23', 'NEW'],
        ['Newcastle', 'Manchester', '2/16', 'LEE']]

df = pd.DataFrame(data=data, columns=['Team', 'Location', 'GameDay', 'Abbrev'])

abbreviations = set(df.Abbrev.values)
df['Location'] = df.apply(lambda row: row['Location'][:3].upper() if row['Location'][:3].upper() in abbreviations else row['Abbrev'], axis=1)

print(df)

输出

         Team Location GameDay Abbrev
0     Arsenal      LON    2/14    LON
1   Liverpool      LIV    2/14    LIV
2  Manchester      MAN    2/16    MAN
3     Arsenal      LON    2/23    NEW
4   Newcastle      MAN    2/16    LEE

更新

如果您喜欢单线:

df['Location'] = df.apply(lambda row: row['Location'][:3].upper() if row['Location'][:3].upper() in df.Abbrev.values else row['Abbrev'], axis=1)

答案 1 :(得分:0)

不确定我是否100%理解,但是仅基于示例数据就可以做到:

df['Location'] = df['Location'].str[:3].str.upper()

但是听起来好像您只希望该位置填充Abbrev中的值,如果值不在Abbrev中,您不会说您希望行为如何,因此我假设NaN

# Map to first 3 letters
df['Location'] = df['Location'].str[:3].str.upper()
# null out values not in Abbrev
df.loc[~df['Location'].isin(df['Abbrev']), 'Location'] = np.nan