我很少看到类似这样的问题
Vectorized alternative to iterrows, Faster alternative to iterrows,Pandas: Alternative to iterrow loops, for loop using iterrows in pandas,python: using .iterrows() to create columns,Iterrows 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()]
我要做什么:
上述内容的更快和矢量化形式。
答案 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()]
是一种迭代熊猫数据框的更快方法。
希望对您有帮助。