Заполните данные из столбца X в столбец Y, если Y имеет NaN, используя python

У меня есть столбец X с некоторыми данными. Я хочу переместить эти данные в другой столбец, скажем Y. У меня есть код для этого.

Это показывает столбцы X и Y # в столбце Y, что означает NAN. Код выглядит следующим образом:

id = df['X'].str.extract(r"(\d[8]s\d[2])",expand=False).tolist() #extracting values which look like 12345678s12 and i include NaN values 

df_new= pd.DataFrame({'Y':id})
wb = load_workbook('text.xlsx')
ws = wb['Sheet1']
for index, row in df_new.iterrows():
    cell = 'Y%d'  % (index + 2)
    ws[cell] = row[0]
wb.save('text.xlsx')

Проблема, с которой я столкнулся, заключается в том, что в столбце Y есть некоторые данные, и код перезаписывает весь столбец Y идентификатором. Я не хочу, чтобы это произошло. Я хочу сохранить данные в столбце Y, и только если в нем есть значения NaN, я хочу, чтобы они были заменены соответствующим значением id.

Вы хотите заменить значения с x на y, где y содержит #?

Mohamed Thasin ah 23.11.2018 11:55

Да, это мой ожидаемый результат

Adarsh Bhansali 23.11.2018 11:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
109
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

mask

Вы можете замаскировать одну серию другой:

df['Y'].mask(df['Y'] == '#', df['X'], inplace=True)

Вот демонстрация версии, которая не работает:

df = pd.DataFrame({'X': ['A', 'B', 'C', 'D', 'E'],
                   'Y': ['#', '1', '2', '#', '3']})

df['Y'] = df['Y'].mask(df['Y'] == '#', df['X'])

print(df)

   X  Y
0  A  A
1  B  1
2  C  2
3  D  D
4  E  3

Если бы вместо # был пробел, как бы изменился код?

Adarsh Bhansali 23.11.2018 12:09

Если под пустым вы подразумеваете пустую строку, используйте df['Y'].isin(['#', '']) для логического условия. Если вы имеете в виду нулевое значение (NaN), используйте df['Y'].isnull() | df['Y'].eq('#').

jpp 23.11.2018 12:10

спасибо .. но как мне передать его обратно в файл Excel и вместо df ['X'] я могу использовать идентификатор, чтобы я мог просто передать извлеченные данные.

Adarsh Bhansali 23.11.2018 12:20

@AdarshBhansali, Вы там минимум 3 вопроса задаете. Если есть еще вопрос, пожалуйста, задать новый вопрос.

jpp 23.11.2018 12:23

.loc

Вы хотите заменить значения из x на y, где y содержит #

Если так, попробуйте это,

df.loc[df['Y']=='#','Y']=df['X']

Поскольку ваша цель - заменить только записи, в которых Y имеет #, поэтому замаскировать или заблокировать индекс, где Y имеет # затем присваивает значения из X в Y только заблокированному индексу.

Если вы хотите иметь дело с пустым, тогда

df.loc[df['Y'].isnull(),'Y']=df['X']

Ты можешь использовать:

df['Y'] = np.where(df['Y']=='#', df['X'], df['Y'])

Используйте np.where

df['Y'] = np.where(df['Y'] == '#', df['X'], df['Y'])

Другие вопросы по теме