带有包含列表的列的 Pandas 数据帧:如何“动态”访问元素

Pandas dataframe with a column containing lists : how to access elements "dynamically"

提问人:guedj 提问时间:10/20/2023 更新时间:10/20/2023 访问量:55

问:

在我的数据帧中,我有一列(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)。提前感谢您的任何提示!

pandas 数据帧 列表 lambda

评论


答:

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 时,否则它是每列),这允许您定义访问该行中多个值的函数。.applydf.applydf['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