首页 > 解决方案 > 如何用for循环和def函数替换列值?

问题描述

我想用 def 函数替换多列的列值。 If value > 8 = 100, if value > 6 = 0, if value < 7 = 0, if NaN = NaN

我的数据如下。

ID  MONTH   COUNTRY Brand   A1  A2  A3  A4  A5  A6  A7  A8  A9  A10
1   201906  USA Apple   10  7   10  0   NaN NaN NaN 10  NaN NaN
2   201906  USA Samsung 8   6   8   NaN NaN NaN NaN 9   NaN NaN
3   201906  USA Apple   10  7   10  NaN NaN 10  3   10  NaN NaN
4   201906  USA Samsung 9   5   10  NaN 1   NaN NaN NaN 7   4
5   201906  USA Apple   10  7   10  NaN NaN NaN NaN 10  NaN NaN

我尝试了下面的代码,但没有更改列值。

list = ['A1', 'A3', 'A4', 'A7', 'A10']
new_list = ['B1', 'B3', 'B4', 'B7', 'B10']

def f(x):
    for i in list:
        if x[i] > 8:
            value = 100
        elif x[i] > 6:
            value = 0
        elif x[i] < 7:
            value = -100
        else:
            value = np.nan
        return value

df[new_list] = df[list].apply(f, axis=1)

我怎么能这样?

标签: pythonpandasdataframe

解决方案


我建议不要在函数内部循环,而是将其移到外部并遍历列:

list = ['A1', 'A3', 'A4', 'A7', 'A10']

def f(x):
    if x > 8:
        value = 100
    elif x > 6:
        value = 0
    elif x < 7:
        value = -100
    else:
        value = np.nan
    return value

for i in list:
    df[i] = df[i].apply(f)

如果您想将更新后的值写入新列,您可以采用两种方法:

添加固定前缀:

for i in list:
    df[i + '_updated'] = df[i].apply(f)

或者使用第二个列表来定义新的列名:

list_current = ['A1', 'A3', 'A4', 'A7', 'A10']
list_new = ['B1', 'B3', 'B4', 'B7', 'B10']

for i, j in zip(list_current, list_new):
    df[j] = df[i].apply(f)`

推荐阅读