我有一栏说X,里面有一些数据。我想将这些数据移到另一列“ Y”中。我有执行此操作的代码。
This shows column X and Y # in Column Y meaning 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列中有一些数据,并且代码用id覆盖了整个Y列。 我不希望发生这种情况。我想将数据保留在Y列中,并且仅当其中包含NaN值时,才希望将它们替换为对应的id值。
答案 0 :(得分:3)
您可以使用:
df['Y'] = np.where(df['Y']=='#', df['X'], df['Y'])
答案 1 :(得分:1)
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
答案 2 :(得分:1)
使用np.where
df['Y'] = np.where(df['Y'] == '#', df['X'], df['Y'])
答案 3 :(得分:0)
.loc
您是否要将值从x
替换为y
,其中y
包含#
如果可以的话,
df.loc[df['Y']=='#','Y']=df['X']
由于您的目标是仅替换Y
具有#
的记录,因此屏蔽或锁定Y具有#的索引,然后从{{1} }至X
仅锁定索引。
如果要处理空白,
Y