Pandas str заменяет удаление всего значения вместо замены

#pandas #string #dataframe #replace

Вопрос:

Есть такое поведение, и я не понимаю, почему это происходит.

 # Make a dataframe with a column of floats
df = pd.DataFrame(columns=['col1'])
df.loc[0] = 10.0
df.loc[1] = 5.0
df.loc[2] = 6.0
df.loc[3] = 20.0

# Convert the column to string
df['col1'] = df['col1'].astype(str)

# Use .str.replace to replace the decimal points of .0 with nothing
df['col1'].str.replace('.0', '')
 

Но это возвращает пустую строку для первого и последнего значения
0
1 5
2 6
3
Имя: col1, dtype: объект

Однако, делая это:

 # Apply replace in a lambda function
df['col1'].apply(lambda x: x.replace('.0', ''))
 

И это возвращает ожидаемые результаты
0 10
1 5
2 6
3 20
Имя: col1, dtype: объект

Это как-то связано с тем, что он путает 0.0 с .0?

Есть идеи, почему это происходит?

Ответ №1:

Потому . что специальный символ регулярного выражения необходим, чтобы избежать его или добавить regex=False :

 df['col2'] = df['col1'].str.replace('.0', '', regex=True)
df['col3'] = df['col1'].str.replace('.0', '', regex=False)
print (df)
   col1 col2 col3
0  10.0   10   10
1   5.0    5    5
2   6.0    6    6
3  20.0   20   20
 

Комментарии:

1. В этом есть смысл! Разница между ними заключается в том, что функция Pandas str.replace принимает регулярное выражение, в то время как стандартная функция замены строки не принимает