如何对来自 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 将COL2COL3 垂直堆叠成长格式。其次,您现在可以使用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】:

如果COL2COL3等价,可以将两列堆叠成长格式,按值分组,用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 值进行分组的主要内容,如果未能解决你的问题,请参考以下文章

计算每行数据表中的唯一值

将 csv 文件转换为字典列表

多列中的不同值

如何对网格/矩阵/表格的两个标题进行列过滤(excel样式)

如何在 col3 的特定条件下获取 col1 和 col2 的每个组合的计数

将特定查询数据从 netezza 数据库导出到 CSV 文件