У меня есть столбец 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.
Да, это мой ожидаемый результат






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
Если бы вместо # был пробел, как бы изменился код?
Если под пустым вы подразумеваете пустую строку, используйте df['Y'].isin(['#', '']) для логического условия. Если вы имеете в виду нулевое значение (NaN), используйте df['Y'].isnull() | df['Y'].eq('#').
спасибо .. но как мне передать его обратно в файл Excel и вместо df ['X'] я могу использовать идентификатор, чтобы я мог просто передать извлеченные данные.
@AdarshBhansali, Вы там минимум 3 вопроса задаете. Если есть еще вопрос, пожалуйста, задать новый вопрос.
.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'])
Вы хотите заменить значения с
xнаy, гдеyсодержит#?