pandas 使用列表的索引从另一列添加字符串列

jhkqcmku  于 2023-06-20  发布在  其他
关注(0)|答案(2)|浏览(140)

有这样的名单的:

name_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']

以及以下df

df = pd.DataFrame(
    {
     'idx': ['(3,)','(3, 5)','(1, 3, 5)',
  '(1, 3, 5, 10)','(1, 3, 5, 8, 10)'],
 'score': [0.773,0.841,0.862,0.874,0.883]
    }
)

df.head(2)
    idx     score
0   (3,)    0.773
1   (3, 5)  0.841

idx列表示name_list的元素的索引。我想用列表中的相应名称向df添加一个新列name

预期效果:

idx     score             name
0              (3,)     0.773             (D,)
1             (3, 5)    0.841           (D, F)
2          (1, 3, 5)    0.862        (B, D, F)
3      (1, 3, 5, 10)    0.874     (B, D, F, K)
4   (1, 3, 5, 8, 10)    0.883  (B, D, F, I, K)
atmip9wb

atmip9wb1#

你需要几个步骤:

  • 为列表的索引->值创建Map字典,
  • 将元组的字符串表示转换为具有ast.literal_eval的元组,
  • 用元组解析Map值
from ast import literal_eval

d = dict(enumerate(name_list))

df['name'] = [tuple(d.get(x, '?') for x in literal_eval(t))
              for t in df['idx']]

如果你确定索引是有效的,就不需要字典了:

df['name'] = [tuple(name_list[x] for x in literal_eval(t))
              for t in df['idx']]

对于作为输出的字符串:

df['name'] = [f"({', '.join(tuple(name_list[x] for x in literal_eval(t)))})"
              for t in df['idx']]

输出:

idx  score             name
0              (3,)  0.773             (D,)
1            (3, 5)  0.841           (D, F)
2         (1, 3, 5)  0.862        (B, D, F)
3     (1, 3, 5, 10)  0.874     (B, D, F, K)
4  (1, 3, 5, 8, 10)  0.883  (B, D, F, I, K)
tnkciper

tnkciper2#

下面是使用str.findall()explode()的方法

df.assign(
    name = (df['idx'].str.findall(r'\d+')
            .explode()
            .astype(int)
            .map(dict(enumerate(name_list)))
            .groupby(level=0).agg(tuple)))

输出:

idx  score             name
0              (3,)  0.773             (D,)
1            (3, 5)  0.841           (D, F)
2         (1, 3, 5)  0.862        (B, D, F)
3     (1, 3, 5, 10)  0.874     (B, D, F, K)
4  (1, 3, 5, 8, 10)  0.883  (B, D, F, I, K)

相关问题