提问人:guedj 提问时间:10/20/2023 更新时间:10/20/2023 访问量:55
带有包含列表的列的 Pandas 数据帧:如何“动态”访问元素
Pandas dataframe with a column containing lists : how to access elements "dynamically"
问:
在我的数据帧中,我有一列(Vector)包含一些元素列表:
import pandas as pd
x1 = ['A1','B1','C1']
x2 = ['A2','B2','C2','D2']
df = pd.DataFrame([['ID_1',0,x1],['ID_2',2,x2]], columns=['ID','Key','Vector'])
print(df)
ID Key Vector
0 ID_1 0 [A1, B1, C1]
1 ID_2 2 [A2, B2, C2, D2]
我想添加一个新列(Value),其中包含 (Key) 中给定位置的 Vector 元素:
ID Key Vector Value
0 ID_1 0 [A1, B1, C1] A1
1 ID_2 2 [A2, B2, C2, D2] C2``
我可以“静态”地做到这一点,例如 df['Value'] = df['Vector'].apply(lambda x: x[1]) 来始终获取位于每个列表索引 1 处的元素,但我不知道如何重用类似的语法来动态获取它(基于 Key)。提前感谢您的任何提示!
答:
1赞
Andrej Kesely
10/20/2023
#1
尝试:
df["Value"] = df.apply(lambda x: x.Vector[x.Key], axis=1)
print(df)
指纹:
ID Key Vector Value
0 ID_1 0 [A1, B1, C1] A1
1 ID_2 2 [A2, B2, C2, D2] C2
评论
1赞
guedj
10/20/2023
谢谢,这正是我在重用 lambda 语法时所寻找的。
2赞
Jacob H
10/20/2023
#2
尝试
df['Value'] = df.apply(lambda row: row['Vector'][row['Key']], 1)
当您在整个 DataFrame () 而不是单个列 () 上使用时,它会将每一行作为 pandas 系列提供给函数(当我们指定 axis = 1 时,否则它是每列),这允许您定义访问该行中多个值的函数。.apply
df.apply
df['Value'].apply
评论
1赞
guedj
10/20/2023
感谢您提供正确的语法以及有关 apply 的解释。
1赞
mozway
10/20/2023
#3
使用列表推导式和 zip
:
df['Value'] = [v[k] for k,v in zip(df['Key'], df['Vector'])]
或者,使用矢量化方法:
df['Value'] = (pd.DataFrame(df['Vector'].tolist())
.to_numpy()[np.arange(len(df)), df['Key']]
)
输出:
ID Key Vector Value
0 ID_1 0 [A1, B1, C1] A1
1 ID_2 2 [A2, B2, C2, D2] C2
评论