python - 如何从数据框中提取父节点和后续节点

标签 python pandas

我正在尝试解决以下问题。有一个数据框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()}))

enter image description here


处理缺失值的变体:

变体 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/

相关文章:

python - CDF 9/7 离散小波变换(卷积)

python - Python 语句中的 if-else 子句

python - 在 for-in 循环之间添加暂停

python - ValueError : view limit minimum -5. 1000000000000005 小于 1 并且是无效的 Matplotlib 日期值

python - 如何禁用 Nose 测试的覆盖率报告

python - 减去两个字典的值

python - "initialize_app ' 默认的 Firebase 应用已经存在。”云函数发布订阅

python - pandas ewm 和滚动方法不填写 NA

python - 如何使用 Pandas 将列表转换为行数据框

python - 如何在 python 3 中从 csv 创建自定义列表?