成千上万的值需要替换为更简单的命名格式。例如,原始数据帧的命名为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])
答案 0 :(得分:2)
使用Series.rank
:
df['new'] = 'HH_' + df['To_be_replaced'].rank(method='dense').astype(int).astype(str)
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_3
和HH_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的双射(即一对一和一对一)映射,这应该可以达到您想要的结果