首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不推荐查找的熊猫矢量化查找()

不推荐查找的熊猫矢量化查找()
EN

Stack Overflow用户
提问于 2022-06-25 11:16:19
回答 3查看 77关注 0票数 2

我的问题与lookup()有关,这是不可取的。所以我想找个替代方案。文档建议使用loc() (它似乎不适用于向量化的方法)或使用melt() (看起来非常复杂)。此外,文档还建议factorize() (我认为)对我的设置不起作用。

问题是:我有一个带有x,y-值的2列DataFrame。

代码语言:javascript
复制
k = 20
y = random.choices(range(1,4),k=k)
x = random.choices(range(1,7),k=k)
tuples = list(zip(x,y))
df = pd.DataFrame(tuples, columns=["x", "y"])
df

我有几个DataFrames的交叉表格式的df。例如,一个名为Cij

代码语言:javascript
复制
Concordance table (Cij):
x     1     2     3    4     5     6  RTotal
y                                           
1   16     15    13  NaN     5   NaN     108
2   NaN    12   NaN   15   NaN   NaN      87
3   NaN   NaN     6  NaN    13    14     121

现在,我希望在Cij中执行df中xy对的向量化查找,以在df中生成一个新的列CrC。到目前为止,它看起来像这样(简单明了):

代码语言:javascript
复制
df["Crc"] = Cij.lookup(df["y"],df["x"])

如果没有lookup(),我如何实现同样的目标?还是我只是不明白建议的替代方案?

提前感谢!

增编:按要求工作代码示例。

代码语言:javascript
复制
data = [[1,1],[1,1],[1,2],[1,2],[1,2],[1,3],[1,3],[1,5],[2,2],[2,4],[2,4],[2,4],[2,4],[2,4],[3,3],[3,3],[3,5],[3,5],[3,5],[3,6],[3,6],[3,6],[3,6],[3,6]]
df = pd.DataFrame(data, columns=["y", "x"])

# crosstab of df
ct_a = pd.crosstab(df["y"], df["x"])
Cij = pd.DataFrame([], index=ct_a.index, columns=ct_a.columns) #one of several dfs in ct_a layout

#row-wise, than column-wise filling of Cij
for i in range(ct_a.shape[0]):           
  for j in range(ct_a.shape[1]):
    if ct_a.iloc[i,j] != 0:
      Cij.iloc[i,j]= ct_a.iloc[i+1:,j+1:].sum().sum()+ct_a.iloc[:i,:j].sum().sum()

#vectorized lookup, to be substituted with future-proof method
df["Crc"] = Cij.lookup(df["y"],df["x"])

注意:在这种情况下,基于循环的“填充”Cij是很好的,因为df的交叉总是很小的。然而,df本身可能非常大,因此矢量化查找是必要的。

EN

回答 3

Stack Overflow用户

发布于 2022-06-26 19:43:28

,您可以根据使用stack创建的元组列表进行reindex操作,然后使用zip

代码语言:javascript
复制
df['Crc'] = Cij.stack().reindex(zip(df['y'], df['x'])).to_numpy()
print(df)

输出:

代码语言:javascript
复制
    y  x   Crc
0   1  1  16.0
1   1  1  16.0
2   1  2  15.0
3   1  2  15.0
4   1  2  15.0
5   1  3  13.0
6   1  3  13.0
7   1  5   5.0
8   2  2    12
9   2  4    15
10  2  4    15
11  2  4    15
12  2  4    15
13  2  4    15
14  3  3   6.0
15  3  3   6.0
16  3  5  13.0
17  3  5  13.0
18  3  5  13.0
19  3  6  14.0
20  3  6  14.0
21  3  6  14.0
22  3  6  14.0
23  3  6  14.0
票数 1
EN

Stack Overflow用户

发布于 2022-07-08 10:23:23

使用文档中的因子化路径,您可以复制查找功能:

代码语言:javascript
复制
x_index, x_uniques = pd.factorize(df.x)

arrays = (Cij
          .reindex(columns = x_uniques)
          .to_numpy()[df.y.factorize()[0], x_index]
         )

df['r'] = arrays

df
    y  x     r   Crc
0   1  1  16.0  16.0
1   1  1  16.0  16.0
2   1  2  15.0  15.0
3   1  2  15.0  15.0
4   1  2  15.0  15.0
5   1  3  13.0  13.0
6   1  3  13.0  13.0
7   1  5   5.0   5.0
8   2  2    12  12.0
9   2  4    15  15.0
10  2  4    15  15.0
11  2  4    15  15.0
12  2  4    15  15.0
13  2  4    15  15.0
14  3  3   6.0   6.0
15  3  3   6.0   6.0
16  3  5  13.0  13.0
17  3  5  13.0  13.0
18  3  5  13.0  13.0
19  3  6  14.0  14.0
20  3  6  14.0  14.0
21  3  6  14.0  14.0
22  3  6  14.0  14.0
23  3  6  14.0  14.0
票数 1
EN

Stack Overflow用户

发布于 2022-06-25 20:27:21

如果您选中了df["Crc"] = Cij.loc[df["y"], df["x"]],您将注意到它返回了一个数组。通过将其与df["Crc"] = Cij.lookup(df["y"],df["x"])进行比较,您还会注意到前面的对角线是相同的(这是有意义的)。因此,可以添加np.diagonal以返回所需的内容:

代码语言:javascript
复制
df["Crc"] = np.diagonal(Cij.loc[df["y"], df["x"]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72753405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档