根据列表顺序重新排列列,然后将列表映射为新列



我需要将列表映射为数据帧中基于另一列的新列,该列具有相同的值,但不同字母可能有不同的大小写:

Input DF (df_temp):
Name  Class
ABC   1
EFG   2
HIJ   3
ABC   4

param_list:
['AbC', 'EfG', 'HiJ']
Output DF (df_temp):
Name  Class  DB_Name
ABC   1      AbC
EFG   2      EfG
HIJ   3      HiJ
ABC   4      AbC

我已经用2 for循环写了一小段代码,但有更好的方法吗:

for param in param_list:
for i in range(len(df_temp.Param_Name.str.lower().tolist())):
if param.lower() == df_temp['Name'][i].lower():
df_temp['DB_Name'][i] = param

通过dict composition和lower中创建的字典将Series.str.lowerSeries.map一起使用,如果某些值不匹配,则会丢失值,如果需要用原始Name值替换,则添加Series.fillna:

L = ['AbC', 'EfG', 'HiJ']
d = {x.lower():x for x in L}
df_temp['DB_Name'] = df_temp['Name'].str.lower().map(d)
#if possible some values not match
#df_temp['DB_Name'] = df_temp['Name'].str.lower().map(d).fillna(df_temp['Name'])
print (df_temp)
Name  Class DB_Name
0  ABC      1     AbC
1  EFG      2     EfG
2  HIJ      3     HiJ
3  ABC      4     AbC

使用join:

s = pd.Series(L, name='DB_name', index=map(str.upper, L))
df_temp = df_temp.assign(k=df['Name'].str.upper()).join(s, on='k').drop('k', 1)

结果:

Name  Class DB_name
0  ABC      1     AbC
1  EFG      2     EfG
2  HIJ      3     HiJ
3  ABC      4     AbC

最新更新