python 使用另一列中元组值的新值添加一列

u3r8eeie  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(155)

我有这个df

df = pd.DataFrame(
    {'loss': [0.044, 0.044, 0.038, 0.037, 0.036], 
  'code': ["('ac',)", "('ac', 'be')", "('ab', 'ac', 'be')",
              "('ab', 'ac', 'be', 'fi')", "('ab', 'ac', 'be', 'de', 'fi')"]}
)

df
     loss                            code
0   0.044                          ('ac',)
1   0.044                     ('ac', 'be')
2   0.038               ('ab', 'ac', 'be')
3   0.037         ('ab', 'ac', 'be', 'fi')
4   0.036   ('ab', 'ac', 'be', 'de', 'fi')

现在我想添加一个新列added-code,新值引入code列。
预期成果:

loss                            code   added-code
0   0.044                          ('ac',)     ac
1   0.044                     ('ac', 'be')     be
2   0.038               ('ab', 'ac', 'be')     ab
3   0.037         ('ab', 'ac', 'be', 'fi')     fi
4   0.036   ('ab', 'ac', 'be', 'de', 'fi')     de
8hhllhi2

8hhllhi21#

假设每行有一个新值,你可以转换成元组explodedrop_duplicates

from ast import literal_eval

df['added'] = (df['code']
 .apply(literal_eval)
 .explode()
 .drop_duplicates()
 )

输出:

loss                            code added
0  0.044                         ('ac',)    ac
1  0.044                    ('ac', 'be')    be
2  0.038              ('ab', 'ac', 'be')    ab
3  0.037        ('ab', 'ac', 'be', 'fi')    fi
4  0.036  ('ab', 'ac', 'be', 'de', 'fi')    de

另一种方法,如注解中所建议的,使用set操作:

df['added'] = (df['code']
 .apply(lambda x: set(literal_eval(x)))
 .diff()
)

输出:

loss                            code added
0  0.044                         ('ac',)   NaN
1  0.044                    ('ac', 'be')  {be}
2  0.038              ('ab', 'ac', 'be')  {ab}
3  0.037        ('ab', 'ac', 'be', 'fi')  {fi}
4  0.036  ('ab', 'ac', 'be', 'de', 'fi')  {de}

相关问题