在具有相同值的Pandas数据框中查找行

时间:2013-07-24 13:54:55

标签: python pandas dataframe pandas-groupby

我目前有一个包含超过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)]

2 个答案:

答案 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