Как изменить значение элементов int в серии

Я хочу только изменить int элементы в этой серии. Я хочу напечатать str значения неизменны и выведите квадратные значения всех int элементы. Почему это не работает?

ser3=pd.Series([100,'bulya',300,'asya'], ['tom','bob','cat','foot']) 
print(ser3) 
for i in ser3.iloc[[]]:
    if type(ser3.iloc[i]) == str:
        print (ser3.iloc[[i]])
    else:
        print (ser3.iloc[[i]]**2)

3 ответа

to_numeric с fillna

(pd.to_numeric(df, errors='coerce')**2).fillna(df)

tom     10000
bob     bulya
cat     90000
foot     asya
dtype: object

Вы можете получить в подсерии, составив карту type и тестирование равенства с int, Тогда фильтр и квадрат.

ser3.loc[ser3.map(type) == int] ** 2

tom    10000
cat    90000
dtype: object

Затем вы можете обновить серию с update метод.

ser3.update(ser3.loc[ser3.map(type) == int] ** 2)
ser3

tom     10000
bob     bulya
cat     90000
foot     asya
dtype: object

Ты можешь использовать pd.Series.apply с пользовательской функцией.

ser3 = pd.Series([100,'bulya',300,'asya'], ['tom','bob','cat','foot'])

res = ser3.apply(lambda x: x**2 if isinstance(x, int) else x)

print(res)

tom     10000
bob     bulya
cat     90000
foot     asya
dtype: object

Однако, на мой взгляд, это неправильное использование панд. Я рекомендую вам реструктурировать ваши данные так, чтобы числовые данные содержались в числовом ряду. После этого вы сможете выполнять операции в векторизованном виде.

Например, чтобы извлечь только квадраты чисел, вы можете использовать pd.to_numeric с последующим dropna:

res = pd.to_numeric(ser3, errors='coerce').dropna()**2

print(res)

tom    10000.0
cat    90000.0
dtype: float64
Другие вопросы по тегам