如何用不同的值替换dataframe列中的重复字符串(重复的字符串应具有相同的新值)

时间:2019-03-26 20:37:29

标签: python

我有这个数据框(示例):

d = {'Col1': [10, 10, 20, 38, 10, 100, 45, 8, 18, 30, 10], 'Col2': [1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0], 'Col3': ['AA', 'BB', 'AA', 'BB', 'BB', 'BB', 'CC', 'AA', 'DD', 'CC', 'BB']}
df = pd.DataFrame(data=d)

Col3中的字符串需要替换为一个值,其中对于所有相同的字符串,此值在所有行上都一致。输出应该看起来像带有Col3_nw的这种数据框:

d_target = {'Col1': [10, 10, 20, 38, 10, 100, 45, 8, 18, 30, 10], 'Col2': [1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0], 'Col3': ['AA', 'BB', 'AA', 'BB', 'BB', 'BB', 'CC', 'AA', 'DD', 'CC', 'BB], 'Col3_nw': [1, 2, 1, 2, 2, 2, 3, 1, 4, 3, 2]}
df_target = pd.DataFrame(data=d_target)

我尝试对Col3上的数据帧进行排序并循环通过,在Col3值相同时添加相同的计数器值,并在显示新的Col3值时向计数器值添加1。

df_temp = df.sort_values('Col3')

String_value = df_temp['Col3'].iloc[0]

Counter = 1
df_temp.loc[0,'Col3_nw'] = Counter

for index, row in df_temp.iterrows():
    if df_temp.iloc[index,'Col3'] == String_value:
       df_temp.loc[index,'Col3_nw'] = Counter
    if df_temp.iloc[index,'Col3'] != String_value:     
        Counter = Counter + 1
        df_temp.loc[index,'Col3_nw'] = Counter

此代码提供了我不理解的错误:

ValueError:基于位置的索引只能具有[整数,整数切片(起始点为INCLUDED,结束点为EXCLUDED),类似整数的列表,布尔数组”类型

有人可以帮助我让它在Python中运行吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以通过词典进行替换:

d = {'Col1': [10, 10, 20, 38, 10, 100, 45, 8, 18, 30, 10], 
     'Col2': [1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0], 
     'Col3': ['AA', 'BB', 'AA', 'BB', 'BB', 'BB', 'CC', 'AA', 'DD', 'CC', 'BB']}

df = pd.DataFrame(data=d)

df['Col3'] = df.Col3.replace({'AA': 1, 'BB': 2, 'CC': 3, 'DD': 4})

编辑: 由于您只是尝试将字符串映射为整数,因此只需将列转换为categorical并使用相关代码即可:

df['Col3'] = df.Col3.astype('categorical').cat.codes