使用lambda函数将pandas数据帧的列乘以每列的不同值

时间:2015-05-09 12:34:39

标签: python pandas lambda

我有以下代码:

    data_keys = data.keys()
    for i in range(1,len(data_keys)):
        multiplier = specie_name_and_initial_values_dict[data_keys[i]]
        data[data_keys[i]]=map(lambda x: multiplier*x, data[data_keys[i]])
    return data

data_keys是从pandas数据帧派生的密钥列表,即

Index([u'Time', u'Cyp26_G_R1', u'Cyp26_G_rep1'], dtype='object')

数据是一个熊猫数据框,即:

    Time  Cyp26_G_R1  Cyp26_G_rep1
0      0         0.0          14.0
1    300         0.0          10.0
2    600         1.0           1.5
3    900         2.0           2.0
4   1200         2.5           1.0    
5   1500         4.0           0.9
6   1800         2.0           2.0
7   2100         2.5           2.5
8   2400         5.0           2.5
9   2700         6.5           0.5
10  3000         6.0           0.4
11  3300         5.5           0.5
12  3600         1.5           1.5    

和specie_name_and_initial_values_dict是一个包含35个键的字典,每个键中有一个值,其中两个键的名称与上面数据框中的列标题相同(不是' Time')。

我试图将数据框的两个数据列乘以我从“specie_name_and_initial_values_dict [data_keys [i]]'中获得的两个值中的每一个。循环内。

我无法粘贴当前输出,因为堆栈溢出不像格式,但当前正在发生的是没有发生乘法,并且迭代地拼接数字,即第一个元素= 240.8856716,第二个= 240.8856716240.8856716和这种情况还在继续。

这显然不是我想要的。有人知道这样做的方法吗?

由于

2 个答案:

答案 0 :(得分:2)

您希望将数据框中的列与字典中的值相乘,其中键是列名?使用mul功能:

In [18]: df
Out[18]: 
    Time  Cyp26_G_R1  Cyp26_G_rep1
0      0         0.0          14.0
1    300         0.0          10.0
2    600         1.0           1.5
3    900         2.0           2.0
4   1200         2.5           1.0
5   1500         4.0           0.9
6   1800         2.0           2.0
7   2100         2.5           2.5
8   2400         5.0           2.5
9   2700         6.5           0.5
10  3000         6.0           0.4
11  3300         5.5           0.5
12  3600         1.5           1.5

In [19]: d
Out[19]: {'Cyp26_G_R1': 100, 'Cyp26_G_rep1': 10}

In [20]: key = 'Cyp26_G_rep1'

我们将增加列' Cyp26_G_rep1'字典d -

中具有相同键的值
In [21]: df[key] = df[key].mul(d[key])

In [22]: df
Out[22]: 
    Time  Cyp26_G_R1  Cyp26_G_rep1
0      0         0.0           140
1    300         0.0           100
2    600         1.0            15
3    900         2.0            20
4   1200         2.5            10
5   1500         4.0             9
6   1800         2.0            20
7   2100         2.5            25
8   2400         5.0            25
9   2700         6.5             5
10  3000         6.0             4
11  3300         5.5             5
12  3600         1.5            15

答案 1 :(得分:1)

我到处搜索试图完成完全相同的任务。我发现了一个不太理想的解决方案,最近才遇到这个解决方案。我采用了fixxer提供的解决方案并以此为基础。我是StackOverflow的新手,因此,由于我不想弄乱原始答案,因此我将提供第二个答案。

在我的解决方案中,我需要保持原始数据帧不变,因此我创建了一个副本。我也有许多列和key:value组合,可通过它们应用mul()函数。因此,我以这种方式遍历了字典:

df2 = df.copy()
for d_key in d.keys():
    key = d_key
    df2[key] = df2[key].mul(d[key])

这对我来说很好