pandas 我如何计算softmax函数的值只有几个Dataframe行?

fsi0uk1n  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(163)

我有以下的Dataframe:
| 联系方式|普拉斯林|平均FGrating|
| --------------|--------------|--------------|
| 二二九四三|1|一百点四三|
| 22944|二|九十三点五|
| 二二九四五|三|一百零四点六|
| 22746|四|一百零一点三|
| 二二九四七|1|一百零二点零五分|
| 二二九四八|二|一百零七点三十五|
| 二二九四九|三|一百零九点一二|
我尝试对整个DataFrame的Average FGrating列应用softmax函数,而Plassering值正在增加。这意味着我想对DataFrame的前四行应用softmax,然后分别对接下来的3行应用softmax,等等。
整个DataFrame大约有5000行,其结构如下。
我的第一个尝试是循环通过这个DataFrame的行,使用iterrows(),当Plassering增加时,将Average FGrating值添加到列表中。当Plassering值小于前一行的值时,我计算softmax,将列表作为参数传递,然后清空列表,循环继续。然而,我读here,这不是一个好主意,性能明智的。
你有比我更好的主意吗?

olhwl3o2

olhwl3o21#

您可以使用groupby转换。首先生成组,然后应用softmax:

import pandas as pd
from scipy.special import softmax

df = pd.read_clipboard() # Your df here

groups = df["Plassering"].diff().lt(0).cumsum()
out = df["Average FGrating"].groupby(groups).transform(softmax)

结果:

>>> groups
0    0
1    0
2    0
3    0
4    1
5    1
6    1
Name: Plassering, dtype: int32
>>> out
0    0.014684
1    0.000014
2    0.950254
3    0.035048
4    0.000726
5    0.145437
6    0.853837
Name: Average FGrating, dtype: float64
nlejzf6q

nlejzf6q2#

基于Plassering值的连续差异(累积为单独的组)和pandas.core.groupby.DataFrameGroupBy.transform操作:

from scipy.special import softmax

df['soft_max'] = (df.groupby(df['Plassering'].diff().ne(1).cumsum())
                  ['Average FGrating'].transform(softmax))
Index  Plassering  Average FGrating  soft_max
0  22943           1            100.43  0.014684
1  22944           2             93.50  0.000014
2  22945           3            104.60  0.950254
3  22746           4            101.30  0.035048
4  22947           1            102.05  0.000726
5  22948           2            107.35  0.145437
6  22949           3            109.12  0.853837

相关问题