我在数据框中有4列,并希望根据以下条件更改第2列中的所有值:
if pd.isnull(df['COL2']) or df['COL2'] == "SOME_NAME":
if pd.isnull(df['COL3']) == False:
df['COL2'] = df['COL3']
else:
df['COL2'] = "DEFAULT"
所以基本上如果col2为空或者有一些特定名称,如果col3不为空,则将其替换为col3,否则替换为默认值
我迭代了df,但匹配并未替换所有值。我有一些col2值仍设置为" SOME_NAME"。有一种简单的方法吗?
答案 0 :(得分:1)
使用loc
赋值,仅更改符合条件的行。
i = df['COL2'].isnull() | df['COL2'].eq('SOME_NAME')
j = df.loc[i, 'COL3']
df.loc[i, 'COL2'] = j.where(j.notnull(), 'DEFAULT')
答案 1 :(得分:0)
我认为|
or
和&
and
的{{1}}需要numpy.where
{/ 3}}。
mask = (df['COL2'].isnull() | (df['COL2'].str.strip() == "SOME_NAME")) & df['COL3'].notnull()
df['COL2'] = np.where(mask, df['COL3'], "DEFAULT")
类似的解决方案:
df['COL2'] = df['COL3'].where(mask, "DEFAULT")
答案 2 :(得分:0)
三元运算符在2.5中被添加,我相信:
if(condition)else
示例数据框:
df = pd.DataFrame({"COL2": ["first", None,"third","fourth", None], "COL3": ["first_","second_","third_","fourth_", None]})
所以你可以做这样的事情来取代价值"第三"或null:
df['COL2'] =df.apply(lambda row: row['COL3'] if ((not row['COL2'] or row['COL2'] == "third") and row['COL3']) else "DEFAULT", axis=1)
输出:
df
Out[21]:
COL2 COL3
0 DEFAULT first_
1 second_ second_
2 third_ third_
3 DEFAULT fourth_
4 DEFAULT None