如何跨csv中的唯一col2和col3值对唯一col1值进行分组

dy1byipe  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(333)

试图转换模式为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的列表(在output table/csv的col2中)。
输出csv/表格:

S1, [INT1, INT2]
S2, [INT1, INT2]
S3, [INT1, INT2]
S4, [INT2]
pw136qt2

pw136qt21#

首先,可以使用melt垂直堆叠 COL2 以及 COL3 变成长格式。其次,现在可以使用groupby按熔融列进行分组,并获得 COL1 对于每个分组(s1、s2等):


# 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]
r8uurelv

r8uurelv2#

如果 COL2 以及 COL3 如果是等价的,则可以将这两列堆叠为长格式,按值分组,并找出该列的唯一元素 INT 带的列 set 功能:

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

相关问题