Панды: Замените пустое поле только на «Na» в определенном столбце, смешанном с плавающими объектами и пустыми строками

#python #pandas #dataframe

Вопрос:

У меня есть этот фрейм данных:

     id      cars  rent  sale
0  123       Kia           2
1  345       Bmw     1     4
2         Mercedes         1
3  345      Ford     1     
4           Audi     2     1
 

Я хочу заполнить пустое поле только в идентификаторе столбца «Na» и оставить пустой код в других столбцах(аренда/Продажа)
Есть какие-нибудь предложения, пожалуйста?

Ожидаемый результат:

    id      cars  rent  sale
0  123       Kia           2
1  345       Bmw     1     4
2   Na  Mercedes           1
3  345      Ford     1     
4   Na      Audi     2     1
 

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

1. df.id = df.id.astype(str).str.replace("^s*$", "Na") Работает?

Ответ №1:

Поскольку ваш id столбец смешан с объектами с плавающей точкой и пустыми полями, и предположим, что вы не хотите изменять объекты с плавающей точкой на строки, вы можете использовать .replace() регулярное выражение следующим образом:

 df['id'] = df['id'].replace(r'^s*

Объяснение:

Регулярное  ^s*$  выражение соответствует нулю или большему количеству пробелов  s  во всех строках. Таким образом, он соответствует пустой строке (ноль пробелов), одному символу пробела, двум символам пробела и т.д. Он заменяет только один Na  , независимо от того, сколько совпадающих пробелов (например, не будет заменяться  NaNa  даже 2 символами пробела).

 ^   Начало привязки строки (вместе с  $  для обозначения соответствия для всей строки)

 s   Пустое пространство

 *   Нулевое или более повторение предшествующего ему символа ( s  ).

 $   Конец веревочного якоря

Результат:

 print(df)

    id      cars rent sale
0  123       Kia         2
1  345       Bmw    1    4
2   Na  Mercedes         1
3  345      Ford    1     
4   Na      Audi    2    1
 

Ответ №2:

Попробуй:

 df.id = df.id.replace("", "Na")
print(df)
 

С принтами:

     id      cars rent sale
0  123       Kia         2
1  345       Bmw    1    4
2   Na  Mercedes         1
3  345      Ford    1     
4   Na      Audi    2    1
 

ИЗМЕНИТЬ: Если пустые ячейки не "" являются строками:

 df.id = df.id.apply(lambda x: x if x.strip() else "Na")
print(df)
 

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

1. @AhmedChater Убедитесь, что пустые ячейки на самом деле "" являются строками.

2. На самом деле это плавающий объект

Ответ №3:

Вы можете использовать фрейм данных.где

 df['id'] = df.where(~(df['id'] == ''), other='Na')
 

Из документации:

Если значение cond равно True, сохраните исходное значение. Где False, замените соответствующим значением из другого

Изменить: Если id столбца нет "" , то

 df['id'] = df.where(~(df['id'].str.strip() == ''), other='Na')
 

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

1. У меня есть объект с плавающей точкой, поэтому я не могу использовать полосу

, 'Na', regex=True)
Объяснение:

Регулярное ^s*$ выражение соответствует нулю или большему количеству пробелов s во всех строках. Таким образом, он соответствует пустой строке (ноль пробелов), одному символу пробела, двум символам пробела и т.д. Он заменяет только один Na , независимо от того, сколько совпадающих пробелов (например, не будет заменяться NaNa даже 2 символами пробела).

^ Начало привязки строки (вместе с $ для обозначения соответствия для всей строки)

s Пустое пространство

* Нулевое или более повторение предшествующего ему символа ( s ).

$ Конец веревочного якоря

Результат:


Ответ №2:

Попробуй:


С принтами:



ИЗМЕНИТЬ: Если пустые ячейки не "" являются строками:


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

1. @AhmedChater Убедитесь, что пустые ячейки на самом деле "" являются строками.

2. На самом деле это плавающий объект

Ответ №3:

Вы можете использовать фрейм данных.где


Из документации:

Если значение cond равно True, сохраните исходное значение. Где False, замените соответствующим значением из другого

Изменить: Если id столбца нет "" , то


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

1. У меня есть объект с плавающей точкой, поэтому я не могу использовать полосу