遍历各列并执行计算

时间:2018-10-18 13:15:11

标签: python pandas

我试图用一个if语句编写一个for循环,该语句遍历各列并执行一些乘法,从而在数据帧中创建一个新列。

到目前为止,我已经实现了这一点,但是显然没有实际生成任何列,这是错误的。任何提示或建议都将受到高度赞赏!

navigator.geolocation

3 个答案:

答案 0 :(得分:0)

能否给我们提供定义变量df的代码?

请记住,数据框比列表要复杂一些。您必须指定要使用的列(请参见the documentation)。

代码的第一行可能应该替换为:

for i in df['name_of_your_column']:

答案 1 :(得分:0)

它是一个数据框,因此您可以执行以下操作

for _, row in df.iterrows():
    if  row['col1'] == 'a' or row['col1'] == 'b' or row['col1'] == 'c':
        row['col1'] = row['col1']* 4
    elif row['col1'] == 'CZK_fwdp':
        row['col1'] = row['col1']* 7
    else:
        row['col1'] = row['col1']* 5

答案 2 :(得分:0)

我创建了一个示例,说明我通常如何执行相同的任务:

df = pd.DataFrame({'a': [1,1,1], 'b': [1,2,3], 'c': [0,-1,-2]})
print(df)
Out:
   a  b  c
0  1  1  0
1  1  2 -1
2  1  3 -2

这是示例数据帧。您可以应用某些函数来修改其所有列,具体取决于列的名称,可用的name属性。例如,列'a'仅具有名称a

df['a'].name
Out:
'a'

def mapper(name):
    return name + '_new'


df_new = df.apply(lambda col: col * 4 if col.name == 'a' or col.name == 'b' 
         else col * 7 if col.name == 'CZK_fwdp' 
         else col * 5, axis=0).rename(mapper=mapper, axis=1)
print(df_new)
Out:
   a_new  b_new  c_new
0      4      4      0
1      4      8     -5
2      4     12    -10

使用apply方法将lambda函数沿参数轴= 1的列应用。函数mapper用于避免干扰列名。要获取所需的数据框,您只需合并旧数据框和新数据框即可:

df_conc = pd.concat((df, df_new), axis=1)
print(df_conc)
Out:
   a  b  c  a_new  b_new  c_new
0  1  1  0      4      4      0
1  1  2 -1      4      8     -5
2  1  3 -2      4     12    -10

如果您不喜欢lambda函数,则可以使用常用函数:

def modify_column(col):
    if col.name == 'a' or col.name == 'b':
        return col * 4
    elif col.name == 'CZK_fwdp':
        return col * 7
    else:
        return col * 5

df_new = df.apply(modify_column, axis=0).rename(mapper=mapper, axis=1)