2017-10-07 357 views
2

我处于一种奇怪的状况。我之前已经解决了我的编程问题,但是我正在回顾并尝试使用熊猫来实现它。我认为这将是一个使用熊猫练习的好地方。如何在pandas df中获取不同的行并将重复项合并到列中?

我在查询数据库,做一些计算,然后用PyQt QTableWidget将结果显示到GUI上。

计算之后的示例表看起来是这样的:

test_list = [["a", "b", "c", "d"], 
      ["1", "3", "5", "7"], 
      ["1", "4", "5", "7"], 
      ["2", "3", "6", "8"], 
      ["2", "4", "6", "9"]] 

我想这样做之前,我展示它是什么:获得基于列的“a”重复行,“C”和“ d“,并将从列”b“中删除的元素合并回列。我想要的结果如下所示:

['a', 'b', 'c', 'd'] 
['1', '3, 4', '5', '7'] 
['2', '3', '6', '8'] 
['2', '4', '6', '9'] 

请注意列“b”,“3,4”在列中的表示方式。

这里是我如何与列表和字典做了它最初:

def mergeDistinct(my_list): 
    new_list_dict = {} 

    for elem in my_list[1:]: 
     key_str = (elem[0], elem[2], elem[3]) 
     if key_str in new_list_dict.keys(): 
      new_list_dict[key_str][1] += ", " + elem[1] 
     else: 
      new_list_dict[key_str] = elem[::] 
      new_list_dict[key_str][1] = elem[1] 

    ret_list = new_list_dict.values() 

    return [my_list[0]] + ret_list 

在所有行的我和循环使用字典来跟踪什么样的价值观的不同组合,我迄今所看到的。我觉得它有点笨重,我正试图在熊猫图书馆工作。我觉得它应该是可能的,但也许我不知道正确的术语,以谷歌了解如何做到这一点。

这是我到目前为止有:

df = pd.DataFrame(data=test_list[1:], columns=test_list[0]) 

def mergeDistinctPandas(my_df): 
     #I feel like this is close but I don't know how to continue 
     df = my_df.set_index(['a', 'b', 'c', 'd']).groupby(level=['a', 'c', 'd']) 
     # for elem in df: 
      # print(elem) 
     # new_df = pd.DataFrame() 
     # for elem in df: 
      # merged = pd.concat([elem[1] for i, row in elem[1].iterrows()]) #.to_frame() 
      # merged.index = ['duplicate_{}'.format(i) for i in range(len(merged))] 
      # new_df = pd.concat([new_df, merged], axis=1) 

     return False 

如果我打印出什么我迄今我看行分开,我应该能够将它们合并回去,留下“B”分离,但我看不出如何去做。

如果熊猫不适合这个问题,那也没关系,我只是试图去解决它。 感谢您的帮助。

这里是我已经发现了一些相关的问题: How to "select distinct" across multiple data frame columns in pandas?How do I merge duplicate rows into one on a DataFrame when they have different values

回答

4
df.groupby([‘a’, ‘c’, ‘d’]).b.apply(‘, ‘.join) \ 
    .reset_index()[df.columns] 
+0

LOL可爱逗号:-) – Wen

相关问题