Заполните данные из столбца X в столбец Y, если Y имеет NaN, используя python - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть столбец с указанием 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.

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

Использование np.where

df['Y'] = np.where(df['Y'] == '#', df['X'], df['Y'])
0 голосов
/ 23 ноября 2018

.loc

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

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

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

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

Если вы хотите иметь дело с пробелом,

df.loc[df['Y'].isnull(),'Y']=df['X']
0 голосов
/ 23 ноября 2018

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

df['Y'] = np.where(df['Y']=='#', df['X'], df['Y'])
0 голосов
/ 23 ноября 2018

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
...