如何在pandas df中获取不同的行并将重复的项合并到一列中?

wsa*_*597 2 python distinct-values pandas

我有点奇怪的情况.我之前已经解决了我的编程问题,但我正在回顾它并尝试使用pandas来实现它.我认为这是练习使用熊猫的好地方.

我正在查询数据库,进行一些计算,然后使用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"]]
Run Code Online (Sandbox Code Playgroud)

在显示之前我想要做的是:根据列"a","c"和"d"获取不同的行,并将列"b"中的删除元素合并回列中.我想要的结果如下:

['a', 'b', 'c', 'd']
['1', '3, 4', '5', '7']
['2', '3', '6', '8']
['2', '4', '6', '9']
Run Code Online (Sandbox Code Playgroud)

注意列"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
Run Code Online (Sandbox Code Playgroud)

我循环遍历所有行并使用字典来跟踪到目前为止我看到的值的不同组合.我觉得感觉有点笨重,我正在尝试大熊猫图书馆.我觉得它应该是可能的,但也许我不知道google理解如何做到这一点的正确术语.

这是我到目前为止:

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
Run Code Online (Sandbox Code Playgroud)

如果我打印出我到目前为止的内容,我看到行已经分开了,我应该能够将它们合并回来,让"b"分开,但我看不出怎么做.

如果熊猫不适合这个问题,那也没关系,我只是想抓住它.谢谢您的帮助.

以下是我发现的一些相关问题: 如何在pandas中的多个数据框列中"选择不同"?我如何合并重复的行成一个一个数据帧时,他们有不同的价值观

piR*_*red 5

df.groupby([‘a’, ‘c’, ‘d’]).b.apply(‘, ‘.join) \
  .reset_index()[df.columns]
Run Code Online (Sandbox Code Playgroud)