替换数据框Python列中的多个值

时间:2019-11-11 06:46:25

标签: python pandas dataframe replace

成千上万的值需要替换为更简单的命名格式。例如,原始数据帧的命名为AB5648,CD5678,EF5468等,并且需要根据我创建的对应表将其替换为HH_1,HH_2,HH_3等。 对应表包含要替换和要替换的值。

Original file = df_temp 

Filename = 'HH_number_Old.csv'
Filename = 'HH_number_New.csv'

Old                     New
AB1321                 HH_1
CD5678                 HH_2
EF5468                 HH_3
EF5468                 HH_3
EF5438                 HH_4
EF5368                 HH_5
EF5068                 HH_6
EF5468                 HH_7
EF5458                 HH_8
EF5168                 HH_9
.....                 .....
XZ5465                HH_3000

这就是我尝试过的。

for i in range (3000):
    print(HH_number_old[i])
    print(HH_number_new[i])

    temp_fin = df_temp.replace({HH_contract[i], HH_no[i]}, inplace=True) 
          #temp_fin is the resultant dataframe with replaced values

Result = temp_fin file is empty.

当我尝试如下特定数量的[i]时,替换有效。

temp_fin = df_temp.replace (HH_number_old[1], HH_number_new[1])

2 个答案:

答案 0 :(得分:2)

使用Series.rank

df['new'] = 'HH_' + df['To_be_replaced'].rank(method='dense').astype(int).astype(str)

GroupBy.ngroup

df['new'] = 'HH_' + df.groupby('To_be_replaced', sort=False).ngroup().add(1).astype(str)

print (df)
  To_be_replaced To_replace   new
0         AB1321       HH_1  HH_1
1         CD5678       HH_2  HH_2
2         EF5468       HH_3  HH_3
3         EF5468       HH_3  HH_3
4         EF5468       HH_3  HH_3
5         EF5468       HH_3  HH_3
6         EF5468       HH_3  HH_3
7         EF5468       HH_3  HH_3
8         EF5468       HH_3  HH_3
9         EF5468       HH_3  HH_3

编辑:

要替换多个其他DataFrame,请使用:

d = dict(zip(df['To_be_replaced'], df['new']))

然后在另一个数据帧中Series.map

df1['new'] = df1['To_be_replaced'].map(d)
df2['new'] = df2['To_be_replaced'].map(d)

答案 1 :(得分:1)

我看到EF5468正在根据您的问题同时映射为HH_3HH_7。我猜想此映射应该是唯一的(将其作为DataFrame导入并使用字典理解应创建唯一的键/值对)。

您可以为此使用地图:

mapping_dict = {
'AB1321':                'HH_1', 
'CD5678':                'HH_2', 
'EF5468':                'HH_3',
'EF5438':                'HH_4',
'EF5368':                'HH_5',
'EF5068':                'HH_6',
'EF5458':                'HH_7',
'EF5168':                'HH_8'

df['new'] = df['old'].map(mapping_dict)

假设我正确理解了您的问题(每个ID仅出现一次),并且存在从旧ID到新ID的双射(即一对一和一对一)映射,这应该可以达到您想要的结果