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

3
我正在尝试计算给定的两个字符串组合出现的次数,无论哪个字符串在前面或后面。
以下是我的代码:
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

但是因为Kim YY Smith JR和Smith JR Kim 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 这一行,且 Count 为 2。另外,在我的实际数据中,对于某些行来说,Count 可能大于1。

2个回答

5
在向数据框中添加内容之前,将两列内容一起排序,以确保一对只会按特定顺序出现。然后再应用计数方法。使用来自链接的排序方法。
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

3

快速而简单

但并不那么“肮脏”

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接