根据相应行的其他列中的值更改列中每行中的值(Python/Pandas)

pnwntuvh  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(79)
data = [{'a': 12, 'b': 2, 'c': 3, 'd': 'bat'},
        {'a': 'NaN', 'b': 20, 'c': 30, 'd': 'ball'},
        {'a': 4, 'b': 20, 'c': 30, 'd': 'pin'}]

df = pd.DataFrame(data)

字符串
我很难弄清楚如何根据列c和d设置的条件将列a中的NaN值替换为列b中的值。例如,如果我想在c > 20且'd' = 'ball的情况下用B列的值(分别为2和20)替换a列中的NaN值。
有人能帮我一下吗?
我已经尝试了很多使用df.loc和df.mask的解决方案,但都没有奏效。

x9ybnkn6

x9ybnkn61#

您可以使用df.apply执行此操作

def fill_na(row: pd.Series):
    if pd.isna(row[0]):
        if row[2] > 20 and row[3] == "ball":
            row[0] = row[1]
    return row

df = df.apply(fill_na, axis=1)

字符串
由于您没有满足条件的行,因此可以使用此选项进行测试

[{'a': np.NaN, 'b': 2, 'c': 3, 'd': 'bat'},
 {'a': 10, 'b': 20, 'c': 30, 'd': 'ball'},
 {'a': np.NaN, 'b': 20, 'c': 30, 'd': 'pin'},
 {'a': np.NaN, 'b': 15, 'c': 30, 'd': 'ball'}]

cvxl0en2

cvxl0en22#

试试看:

df['a'].loc[(df['a'].isna())&(df['c'] > 20) & (df['d'] == 'ball')] =df['b'].loc[(df['a'].isna())&(df['c'] > 20) & (df['d'] == 'ball')]

字符串

相关问题