用于在不同df列中选择相同成员的Python列表推导/循环

时间:2017-09-09 13:26:07

标签: python pandas list-comprehension

我是Python的新手,我遇到了以下问题。

我有几个问题,我发现自己很难解决。

假设我们有两个pandas数据帧,我可以从中提取两列。 假设在一个名为col1的列中,我们有主题名称,可以在同一列中重复,形式如下:'QUENTIN TARANTINO'或'Tarantino Quentin'。在另一列col2中,我有以下形式的条目:'TARANTINO,QUENTIN'或'Tarantino,Quentin',也可以重复。

显然,'TARANTINO,QUENTIN'或'Tarantino,Quentin'是同一主题,但却是不同的对象!

我想在一列中“合并”这两列,以便同一主题只有一个标签。如何使用列表推导(或循环)使其报告两个名称(以这种形式:'TARANTINO,QUENTIN')及其计数?

col1 = ['QUENTIN TARANTINO', 'BARACK OBAMA', 'QUENTIN TARANTINO', 'CHARLIE CHAPLIN', 'JAMES LEBRON', 'KOBE BRYANT', 'Philippe Wain', 'LE CAM ALBERT', 'ANDREW ROBERTS', 'Obama Barack', 'tarantino quentin']

col2 = ['OBAMA, BARACK', 'CHAIN, GEORGE', 'Phylo, SOPY', 'Losan, Santos']

2 个答案:

答案 0 :(得分:1)

解决这个问题的简单方法是使用set try this: 因为您需要首先将较低的值应用于列表中的所有元素

col = list(set( [x.lower().replace(', ',' ') for x in col1]+[x.lower().replace(', ',' ') for x in col2]))

答案 1 :(得分:1)

除了Espoir的回答,要照顾翻转,请运行:

col = list(set( [x.lower().replace(', ',' ') for x in col1]+[x.lower().replace(', ',' ') for x in col2])) #thanks espoir
for x in col:
    rev = [i for i in reversed(x.split())]
    if ' '.join(rev) in col:
        col.pop(col.index(x))

它将消除col中的翻转重复。

它的作用,

  1. 迭代col。
    1. 生成每个名称的反向列表。
    2. 检查已加入的反向名称是否已存在。
      1. 如果是,请将其从列表中删除
  2. reversed(list)将返回一个迭代器,因此它应该是for循环的主题。 rev只保留翻转名称的副本,以便在下一步中轻松进行比较。