我正在使用python进行实践的小型程序,需要一些帮助来尝试比较数据帧中的两列并将另一列的内容替换。将数据框转换为excel后,可以看到结果。
无论如何,我想根据每列的前三个字母比较两列Location
和Abbrev
,然后用缩写代替。因此,应将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)
我想帮助找出我的代码有什么问题。
答案 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