避免Pandas DataFrame中的循环的有效方法

时间:2017-04-19 00:43:24

标签: python pandas

我将Excel电子表格转换为Python,以便自动化并加速多项任务。我需要向DataFrame添加几个列,并根据前一列中的值向它们添加数据。我已经使用两个嵌套的for循环工作,但它真的很慢,我知道Pandas并不是专为逐个细胞工作而设计的。以下是我的问题样本:

import pandas as pd

results = pd.DataFrame({'scores':[78.5, 91.0, 103.5], 'outcomes':[1,0,1]})

thresholds = [103.5, 98.5, 93.5, 88.5, 83.5, 78.5]

for threshold in thresholds:
    results[str(threshold)] = 0
    for index, row in results.iterrows():
        if row['scores'] > threshold:
            results.set_value(index, str(threshold), row['outcomes'])

print (results)

正确的输出:

   outcomes  scores  103.5  98.5  93.5  88.5  83.5  78.5
0         1    78.5      0     0     0     0     0     0
1         0    91.0      0     0     0     0     0     0
2         1   103.5      0     1     1     1     1     1

更有效的方法是什么?我一直在想要将DataFrame转换为按列而不是行来工作,但我无法使用任何工作。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

这可以胜任:

import pandas as pd

results = pd.DataFrame({'scores':[78.5, 91.0, 103.5], 'outcomes':[1,0,1]})

thresholds = [103.5, 98.5, 93.5, 88.5, 83.5, 78.5]

for threshold in thresholds:
    results[str(threshold)] = results[['scores','outcomes']].apply(lambda x: x['outcomes'] if x['scores']>threshold else 0, axis=1)

print (results)

哪些代词

   outcomes  scores  103.5  98.5  93.5  88.5  83.5  78.5
0         1    78.5      0   0.0   0.0   0.0   0.0   0.0
1         0    91.0      0   0.0   0.0   0.0   0.0   0.0
2         1   103.5      0   1.0   1.0   1.0   1.0   1.0

答案 1 :(得分:1)

下面是一个完全矢量化的解决方案,不使用循环或列表理解。

{{1}}