使用 pandas 数据框中存储的索引提取数组值

问题描述 投票:0回答:1

我有一个 numpy 数组:

np.random.seed(123456)
a=np.random.randint(0,9, (5,5))

array([[1, 2, 1, 8, 0],
       [7, 4, 8, 4, 2],
       [6, 6, 7, 2, 6],
       [2, 4, 4, 7, 4],
       [4, 4, 5, 1, 7]])

还有一个 pandas 数据框,其中包含我想要数据的索引:

df = pd.DataFrame([[0,1],[1,2],[2,3]],columns=['i','j'])

过去我用过:

df['vals'] = df[['i', 'j']].apply(lambda x: a[x[0], x[1]], axis=1)

   i  j  vals
0  0  1     2
1  1  2     8
2  2  3     2

这给了我我想要的值(2,8,2),但已经开始给我以下警告:

未来警告:系列。获取项目 不推荐将键视为位置。在未来的版本中,整数 键将始终被视为标签(与 DataFrame 一致 行为)。要按位置访问值,请使用

ser.iloc[pos]

df['vals'] = df[['i', 'j']].apply(lambda x: a[x[0], x1], axis=1)

here所述,尝试使用

df.loc[:, 'vals'] = df.loc[:,['i', 'j']].apply(lambda x: d[x[0], x[1]], axis=1)
,但我仍然收到警告。另外,按照建议,我尝试使用
df['vals'] = df[['i', 'j']].apply(lambda x: a[*x], axis=1)
但出现语法错误

任何人都可以建议更好的方法吗?我不喜欢压制警告,因为我通常会从中学到一些东西。

pandas numpy warnings
1个回答
0
投票

您没有按照链接的问答建议执行的操作。

使用

iloc
实际上会 关闭
FutureWarning
:

# Timeless
df["vals"] = df[["i", "j"]].apply(lambda x: a[x.iloc[0], x.iloc[1]], axis=1)

# Corralien
df["vals"] = df[["i", "j"]].apply(lambda x: a[(..., *x)], axis=1)

但是FWIW,在您的上下文中,您应该使用numpy的高级索引

# hpaulj
df["vals"] = a[df["i"], df["j"]]
© www.soinside.com 2019 - 2024. All rights reserved.