如何在 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]
我的处境有点奇怪。我之前已经解决了我的编程问题,但我正在回顾它并尝试使用 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]