将函数应用于数据框以创建列表的矢量化方法

时间:2018-11-29 09:22:24

标签: python pandas

我很少看到类似这样的问题

Vectorized alternative to iterrowsFaster alternative to iterrowsPandas: Alternative to iterrow loopsfor loop using iterrows in pandaspython: using .iterrows() to create columnsIterrows performance。但似乎每个人都是一个独特的案例,而不是一种通用的方法。

我的问题还是关于.iterrows

我试图将第一行和第二行传递给一个函数,并从中创建一个列表。

我所拥有的:

我有一个Pandas DataFrame,其中有两列看起来像这样。

         I.D         Score
1         11          26
3         12          26
5         13          26
6         14          25

我做什么:

其中Point是我之前定义的功能。

my_points = [Points(int(row[0]),row[1]) for index, row in score.iterrows()]

我要做什么:

上述内容的更快和矢量化形式。

3 个答案:

答案 0 :(得分:1)

实际上,问题不在于如何遍历DataFrame并返回列表,而在于如何对列中的DataFrame中的值应用函数。

您可以将axis设置为1的情况下使用pandas.DataFrame.apply

df.apply(func, axis=1)

要放入列表中,取决于函数返回的内容,但您可以:

df.apply(Points, axis=1).tolist()

如果您只想应用于某些列:

df[['Score', 'I.D']].apply(Points, axis=1)

如果您想在需要多个func的{​​{1}}上申请,请使用args来提高速度:

numpy.vectorize

np.vectorize(Points)(df['Score'], df['I.D'])

lambda

答案 1 :(得分:1)

尝试列表理解:

score = pd.concat([score] * 1000, ignore_index=True)

def Points(a,b):
    return (a,b)

In [147]: %timeit [Points(int(a),b) for a, b in zip(score['I.D'],score['Score'])]
1.3 ms ± 132 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [148]: %timeit [Points(int(row[0]),row[1]) for index, row in score.iterrows()]
259 ms ± 5.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [149]: %timeit [Points(int(row[0]),row[1]) for row in score.itertuples()]
3.64 ms ± 80.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

答案 2 :(得分:1)

您是否尝试过方法.itertuples()

my_points = [Points(int(row[0]),row[1]) for row in score.itertuples()]

是一种迭代熊猫数据框的更快方法。

希望对您有帮助。