我目前有一个包含超过1,0000行和600列的大型数据框。该表在左侧按标识索引,每列是一个位置。网格中每个点的值是0或1.我希望能够通过确定哪些在其行中具有0和1的相同模式来捕获并对标识进行分组。
例如:
print df.table
ID#1 0 1 0 1 0 0 1 0 1
ID#2 0 0 1 0 1 0 1 0 1
ID#3 1 0 0 0 1 0 1 1 0
ID#4 0 1 0 1 0 0 1 0 1
ID#5 1 0 0 0 1 0 1 1 0
ID#6 0 0 1 0 1 0 1 0 1
df.table.'GROUP' returns
[(ID#1,ID#4), (ID#2,ID#6), (ID#3,ID#5)]
答案 0 :(得分:2)
In [39]: data = """ID#1 0 1 0 1 0 0 1 0 1
ID#2 0 0 1 0 1 0 1 0 1
ID#3 1 0 0 0 1 0 1 1 0
ID#4 0 1 0 1 0 0 1 0 1
ID#5 1 0 0 0 1 0 1 1 0
ID#6 0 0 1 0 1 0 1 0 1
"""
In [40]: df = read_csv(StringIO(data),header=None,sep='\s+',index_col=0)
In [41]: df['compressed'] = df.apply(lambda x: ''.join([ str(v) for v in x ]),1)
In [42]: df
Out[42]:
1 2 3 4 5 6 7 8 9 compressed
0
ID#1 0 1 0 1 0 0 1 0 1 010100101
ID#2 0 0 1 0 1 0 1 0 1 001010101
ID#3 1 0 0 0 1 0 1 1 0 100010110
ID#4 0 1 0 1 0 0 1 0 1 010100101
ID#5 1 0 0 0 1 0 1 1 0 100010110
ID#6 0 0 1 0 1 0 1 0 1 001010101
In [43]: df.groupby('compressed').apply(lambda x: x.index.tolist())
Out[43]:
compressed
001010101 [ID#2, ID#6]
010100101 [ID#1, ID#4]
100010110 [ID#3, ID#5]
dtype: object
您还可以再进行2次重新调整(在添加“压缩”列之前执行此操作)
创建一个系列,其值为1个位置的元组
In [45]: pd.concat([ Series([ tuple(x[x.astype(bool)].index.tolist()) ], index=[row]) for (row,x) in df.iterrows() ])
Out[45]:
ID#1 (2, 4, 7, 9)
ID#2 (3, 5, 7, 9)
ID#3 (1, 5, 7, 8)
ID#4 (2, 4, 7, 9)
ID#5 (1, 5, 7, 8)
ID#6 (3, 5, 7, 9)
dtype: object
创建一个每1个位置都有一列的框架
In [46]: DataFrame(dict([ (row,x[x.astype(bool)].index.tolist()) for (row,x) in df.iterrows() ])).T
Out[46]:
0 1 2 3
ID#1 2 4 7 9
ID#2 3 5 7 9
ID#3 1 5 7 8
ID#4 2 4 7 9
ID#5 1 5 7 8
ID#6 3 5 7 9
答案 1 :(得分:1)
data =“”“ID#1 0 1 0 1 0 0 1 0 1 ID#2 0 0 1 0 1 0 1 0 1 ID#3 1 0 0 0 1 0 1 1 0 ID#4 0 1 0 1 0 0 1 0 1 ID#5 1 0 0 0 1 0 1 1 0 ID#6 0 0 1 0 1 0 1 0 1 “”“
主题的变化。
df = read_csv(StringIO(data),header=None,sep='\s+',index_col=range (1,10))
df.groupby(level = range(9)).apply(lambda x: x[0].tolist())
1 2 3 4 5 6 7 8 9
0 0 1 0 1 0 1 0 1 [ID#2, ID#6]
1 0 1 0 0 1 0 1 [ID#1, ID#4]
1 0 0 0 1 0 1 1 0 [ID#3, ID#5]
dtype: object