如何在groupby中组合连接的字符串

2024-05-13 19:54:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何计算两个字符串的给定组合,而不管哪个字符串是第一个/第二个。你知道吗

这是我的密码:

import pandas as pd

mylist = [[('Smith JR', 'Kim YY'), ('Smith JR', 'Ron AA'), ('Kim YY', 'Ron AA')],
          [('Kim YY', 'Smith JR')], [('Smith JR', 'Ron AA')]]

flat_list = [item for sublist in mylist for item in sublist]

df = pd.DataFrame(flat_list, columns=["From", "To"])
df_graph = df.groupby(["From", "To"]).size().reset_index()
df_graph.columns = ["From", "To", "Count"]

print(df_graph)

它给出:

       From        To  Count
0    Kim YY    Ron AA      1
1    Kim YY    Smith JR    1
2  Smith JR    Kim YY      1
3  Smith JR    Ron AA      2

但由于金YY小史密斯和金YY小史密斯在同两个人之间形成了一种联系,我希望它能给予:

       From        To  Count
0    Kim YY    Ron AA      1
1    Kim YY    Smith JR    2
2  Smith JR    Ron AA      2

我见过许多解决方案,它们删除了重复的行,但没有按照我的意愿合并每行的计数。我好像不知道怎么把

1    Kim YY    Smith JR    1
2  Smith JR    Kim YY      1

行,这样就只剩下Kim YY-Smith JR行,并且计数是2。另外,在我的实际数据中,给定行的计数可以大于1。你知道吗


Tags: to字符串fromdfcountgraphaapd
2条回答

快而脏

但没那么脏

pd.value_counts([*map(frozenset, zip(df.From, df.To))])

(Smith JR, Ron AA)    2
(Kim YY, Smith JR)    2
(Kim YY, Ron AA)      1
dtype: int64

在添加到数据帧之前,将这两列排序在一起,这样就可以保证一对只按特定顺序出现。然后才应用你的计数方法。使用link中的方法进行排序:

import pandas as pd
import networkx as nx

mylist = [[('Smith JR','Kim YY'),('Smith JR','Ron AA'),('Kim YY','Ron AA')],[('Kim YY','Smith JR')],[('Smith JR','Ron AA')]]

flat_list = [item for sublist in mylist for item in sublist]

df = pd.DataFrame(flat_list, columns=["From", "To"])
#create a new dataframe with the value pairs sorted. You can also sort earlier if you prefer.
df = pd.DataFrame(np.sort(df[["From", "To"]]), columns = ["From", "To"])
#now, just apply the groupby.
df_graph = df.groupby(["From", "To"], axis=0).size().reset_index()
#Output:
     From        To  0
0  Kim YY    Ron AA  1
1  Kim YY  Smith JR  2
2  Ron AA  Smith JR  2

相关问题 更多 >