从熊猫数据框中获取重复值的位置

时间:2019-07-19 08:30:31

标签: python python-3.x pandas numpy

我的熊猫数据框为20,000 X 48,如下所示(未提供所有数据)。

     0       1       2       3       4
0    1  0.4784  0.4764  0.4251  0.4915
1    2  0.6180  0.4503  0.3737  0.5377
2    3  0.6735  0.4317  0.6295  0.5470
3    4  0.5294  0.5871  0.5278  0.5544
4    5  0.5555  0.4784  0.5443  0.5259
5    6  0.4784  0.5798  0.6118  0.5491
6    7  0.5397  0.8885  0.6683  0.6056
7    8  0.8174  0.7972  0.5230  0.5707
8    9  0.5763  0.6118  0.6675  0.5457
9   10  0.8045  0.6249  0.5407  0.6716
10  11  0.8036  0.6599  0.4947  0.6440
11  12  0.7665  0.5408  0.4784  0.6212
12  13  0.6273  0.7438  0.4784  0.8148
13  14  0.4217  0.8473  0.6894  0.7844
14  15  0.8768  0.4784  0.8009  0.5160
15  16  0.5410  0.9091  0.6329  0.7311
16  17  0.4784  0.5506  0.5655  1.0636
17  18  0.6490  0.5864  0.5687  1.2680
18  19  0.5173  0.4768  1.1053  0.5361
19  20  0.5841  1.0596  0.7043  0.6657

我想从每一列(0到4)中获取唯一值,并确定它们出现在什么位置。

第1列的示例我想知道每个值的位置,如下所示

[0.4784:(0,16), 0.6180:1, 0.6735:2...... so on]

在pandas或numpy中是否有任何内置函数可以做到这一点

编辑

@chris和@jazrael的回答为我工作。我正在使用@chris第二种解决方案,因为它很容易阅读。

2 个答案:

答案 0 :(得分:5)

使用df.index.groupby

df.index.groupby(df['1'])
#or
{k:list(v) for k,v in df.index.groupby(df['1']).items()}

输出:

{0.4217: [13],
 0.4784: [0, 5, 16],
 0.5173: [18],
 0.5294: [3],
 0.5397: [6],
 0.541: [15],
 0.5555: [4],
 0.5763: [8],
 0.5841: [19],
 0.618: [1],
 0.6273: [12],
 0.649: [17],
 0.6735: [2],
 0.7665: [11],
 0.8036: [10],
 0.8045: [9],
 0.8174: [7],
 0.8768: [14]}

答案 1 :(得分:3)

对具有Seriesjoin的字符串中的索引值的list使用字典推导:

dfs = {x: df.rename(str).reset_index().groupby(x, sort=False)['index'].apply(', '.join) 
          for x in df.columns}

#select by column name
print (dfs['1'])
1
0.4784    0, 5, 16
0.6180           1
0.6735           2
0.5294           3
0.5555           4
0.5397           6
0.8174           7
0.5763           8
0.8045           9
0.8036          10
0.7665          11
0.6273          12
0.4217          13
0.8768          14
0.5410          15
0.6490          17
0.5173          18
0.5841          19
Name: index, dtype: object

如果需要列表:

dfs = {x: df.reset_index().groupby(x, sort=False)['index'].apply(list) for x in df.columns}

#select by column name
print (dfs['1'])
1
0.4784    [0, 5, 16]
0.6180           [1]
0.6735           [2]
0.5294           [3]
0.5555           [4]
0.5397           [6]
0.8174           [7]
0.5763           [8]
0.8045           [9]
0.8036          [10]
0.7665          [11]
0.6273          [12]
0.4217          [13]
0.8768          [14]
0.5410          [15]
0.6490          [17]
0.5173          [18]
0.5841          [19]
Name: index, dtype: object