Pandas dataframe基于嵌套if条件设置列值

时间:2018-02-05 17:18:21

标签: python pandas

我在数据框中有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"。有一种简单的方法吗?

3 个答案:

答案 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