我有这个数据框(示例):
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中运行吗?
非常感谢!
答案 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