我正在尝试解决以下问题。有一个数据框df
:
df =
ID GROUP_1 GROUP_2 GROUP_3 GROUP_4
1 AAA AAA BBB CCC
2 CCC AAA CCC BBB
3 DDD CCC BBB CCC
4 ...
我需要提取所有组序列并对其进行计数。输出应该是这个(在方括号中,我希望拥有给定父节点的所有可能的后续节点):
result =
AAA, 3, [AAA,BBB,CCC]
BBB, 2, [CCC]
CCC, 3, [AAA,BBB]
DDD, 1, [CCC]
我知道如何计算组的唯一出现次数,如下所示:
df.filter(regex="^GROUP").stack().reset_index(level=1, drop=True).reset_index().drop_duplicates()[0].value_counts()
它给出如下输出:
AAA 2
BBB 3
CCC 3
DDD 1
但是,我不知道如何提取所有可能的后续节点而不重复,并计算这些对的所有出现次数(包括重复项)。
最佳答案
这里还有另一个选项:
# melt data frame to long format
long_df = pd.melt(df, id_vars = "ID", value_name="First")
# create a shifted subsequent nodes column
(long_df.assign(Second = long_df.groupby("ID").First.shift(-1))
# aggregation grouped by the first column
.groupby('First').Second
.agg({'Count': 'count', 'Second': lambda x: x.dropna().unique().tolist()}))
处理缺失值的变体:
变体 1:
dropna()
创建移位列后,这将删除任何包含 nan
的对:
(long_df.assign(Second = long_df.groupby("ID").First.shift(-1)).dropna()
.groupby('First').Second
.agg({'Count': 'count', 'Second': lambda x: x.unique().tolist()}))
变体 2:
在创建移位列之前删除长格式数据框中的缺失值,这会将缺失值之前的非缺失值与缺失值之后的非缺失值连接起来:
(long_df.dropna().assign(Second = long_df.groupby("ID").First.shift(-1))
.groupby('First').Second
.agg({'Count': 'count', 'Second': lambda x: x.unique().tolist()}))
关于python - 如何从数据框中提取父节点和后续节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41395604/