【问题标题】:How to group unique COL1 values across unique COL2 & COL3 values from CSV如何对来自 CSV 的唯一 COL2 和 COL3 值的唯一 COL1 值进行分组
【发布时间】: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 列唯一?

标签: python csv pandas hive itertools


【解决方案1】:

首先,您可以使用meltCOL2COL3 垂直堆叠成长格式。其次,您现在可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多