首页 > 解决方案 > 如何根据列值修改数据框

问题描述

我想根据 rel_list 将关系添加到列“关系”。具体来说,对于每个元组,即('a','b'),我想将第一行中的关系列值''替换为'b',但不要重复,这意味着对于第二行,不要将 '' 替换为 'a',因为它们被认为是重复的。以下代码不完全正确:

import pandas as pd

data = {
  "names": ['a', 'b', 'c', 'd'],
  "ages": [50, 40, 45, 20],
  "relations": ['', '', '', '']
}
rel_list = [('a', 'b'), ('a', 'c'), ('c', 'd')]

df = pd.DataFrame(data)

for rel_tuple in rel_list:
  head = rel_tuple[0]
  tail = rel_tuple[1]

  df.loc[df.names == head, 'relations'] = tail

print(df)

df 的当前结果是:

     names  ages relations
0     a    50         c
1     b    40          
2     c    45         d
3     d    20  

但是,正确的是:

    names  ages relations
0     a    50         b
0     a    50         c
1     b    40          
2     c    45         d
3     d    20               

有需要添加的新行。在这种情况下,第二行,如上。怎么做?

标签: pandasdataframe

解决方案


您可以制作数据框和merge

(df.drop('relations', axis=1)
   .merge(pd.DataFrame(rel_list, columns=['names', 'relations']),
          on='names',
          how='outer'
         )
  # .fillna('') # uncomment to replace NaN with empty string
 )

输出:

  names  ages relations
0     a    50         b
1     a    50         c
2     b    40       NaN
3     c    45         d
4     d    20       NaN

推荐阅读