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

How to get distinct rows in a pandas df and merge the duplicate items into a column?

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

的好地方

我正在查询数据库,进行一些计算,然后使用 PyQt QTableWidget 在 GUI 上显示结果。

计算后的示例 table 可能如下所示:

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" 获取不同的行,并合并列 [= 中删除的元素=42=]回到专栏。我想要的结果如下所示:

['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

我遍历所有行并使用字典来跟踪到目前为止我看到的不同值组合。我觉得它有点笨拙,我正在 pandas 图书馆尝试一下。我觉得这绝对是可能的,但也许我不知道 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

如果我打印出到目前为止的内容,我会看到行是分开的,我应该能够将它们合并回去,留下 "b" 分开,但我不知道该怎么做。

如果pandas不适合这个问题,那也没关系,我只是想着手解决它。 感谢您的帮助。

以下是我发现的一些相关问题:

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