我的问题与lookup()有关,这是不可取的。所以我想找个替代方案。文档建议使用loc() (它似乎不适用于向量化的方法)或使用melt() (看起来非常复杂)。此外,文档还建议factorize() (我认为)对我的设置不起作用。
问题是:我有一个带有x,y-值的2列DataFrame。
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的
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。到目前为止,它看起来像这样(简单明了):
df["Crc"] = Cij.lookup(df["y"],df["x"])如果没有lookup(),我如何实现同样的目标?还是我只是不明白建议的替代方案?
提前感谢!
增编:按要求工作代码示例。
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本身可能非常大,因此矢量化查找是必要的。
发布于 2022-06-26 19:43:28
,您可以根据使用stack创建的元组列表进行reindex操作,然后使用zip。
df['Crc'] = Cij.stack().reindex(zip(df['y'], df['x'])).to_numpy()
print(df)输出:
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发布于 2022-07-08 10:23:23
使用文档中的因子化路径,您可以复制查找功能:
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发布于 2022-06-25 20:27:21
如果您选中了df["Crc"] = Cij.loc[df["y"], df["x"]],您将注意到它返回了一个数组。通过将其与df["Crc"] = Cij.lookup(df["y"],df["x"])进行比较,您还会注意到前面的对角线是相同的(这是有意义的)。因此,可以添加np.diagonal以返回所需的内容:
df["Crc"] = np.diagonal(Cij.loc[df["y"], df["x"]])https://stackoverflow.com/questions/72753405
复制相似问题