如何对来自 CSV 的唯一 COL2 和 COL3 值的唯一 COL1 值进行分组
Posted
技术标签:
【中文标题】如何对来自 CSV 的唯一 COL2 和 COL3 值的唯一 COL1 值进行分组【英文标题】:How to group unique COL1 values across unique COL2 & COL3 values from CSV 【发布时间】:2017-03-08 21:22:03 【问题描述】:寻求转换具有架构 COL1=INT、COL2=STR、COL3=STR 的 CSV 表:
输入样本
INT1, S1, S2
INT1, S1, S3
INT1, S2, S3
INT2, S1, S2
INT2, S1, S3
INT2, S1, S4
INT2, S2, S3
INT2, S2, S4
INT2, S3, S4
到输出 CSV/表,其中 COL2 或 COL3 中的唯一字符串输出为 COL1,后跟它们出现的唯一 COL1 INT 的列表(在输出表/CSV 的 COL2 中)。
输出 CSV/表格:
S1, [INT1, INT2]
S2, [INT1, INT2]
S3, [INT1, INT2]
S4, [INT2]
【问题讨论】:
独特是什么意思?列唯一还是第 2 列和第 3 列唯一? 【参考方案1】:首先,您可以使用melt 将COL2
和COL3
垂直堆叠成长格式。其次,您现在可以使用groupby 对熔化的列进行分组,并为每个子组(S1、S2 等)获取COL1
的唯一值:
# create example df
df = pd.DataFrame([["INT1", "S1", "S5"],
["INT1", "S2", "S3"],
["INT2", "S1", "S2"],
["INT2", "S1", "S3"]],
columns=["COL1", "COL2", "COL3"])
print(df)
COL1 COL2 COL3
0 INT1 S1 S5
1 INT1 S2 S3
2 INT2 S1 S2
3 INT2 S1 S3
result = pd.melt(df, id_vars="COL1").groupby("value")["COL1"].unique()
print(result)
S1 [INT1, INT2]
S2 [INT1, INT2]
S3 [INT1, INT2]
S5 [INT1]
【讨论】:
【参考方案2】:如果COL2
和COL3
等价,可以将两列堆叠成长格式,按值分组,用set
函数找出INT
列的唯一元素:
df.set_index(0).stack().rename("s").reset_index().groupby('s')[0].apply(set)
#s
# S1 INT2, INT1
# S2 INT2, INT1
# S3 INT2, INT1
# S4 INT2
#Name: 0, dtype: object
【讨论】:
以上是关于如何对来自 CSV 的唯一 COL2 和 COL3 值的唯一 COL1 值进行分组的主要内容,如果未能解决你的问题,请参考以下文章
如何对网格/矩阵/表格的两个标题进行列过滤(excel样式)