Python 在dataframe列中查找重复值的索引

Python 在dataframe列中查找重复值的索引,python,pandas,dataframe,Python,Pandas,Dataframe,我有dataframe列的重复值和计数,但我需要在整个列中找到特定重复值的索引查找样本数据帧的索引,因为该索引不是唯一的 In[1]: data = [['Center for epidemiological studies depression (CESD)','a'], ['Center for epidemiological studies depression (CESD)','b'], ['Social Causes of Depression','b'], ['Social Caus

我有dataframe列的重复值和计数,但我需要在整个列中找到特定重复值的索引查找样本数据帧的索引,因为该索引不是唯一的

In[1]:
data = [['Center for epidemiological studies depression (CESD)','a'], ['Center for epidemiological studies depression (CESD)','b'], ['Social Causes of Depression','b'], ['Social Causes of Depression','b']]
df = pd.DataFrame(data,columns=['Column1','Column2'])
Out[2]:
print (df)
        Column1                                                   Column2
0     Center for epidemiological studies depression (CESD)          a
0     Social Causes of Depression                                   b
1     Center for epidemiological studies depression (CESD)          a
1     Social Causes of Depression                                   b
2     Depressive Realism                                            c
在这里,我获得了列行的重复值,但我还需要特定重复引用的索引,但无法获得

此外,使用
groupby
会产生奇怪的结果。这是我想要的东西。看看这些数据,“第0个”索引是第一篇在参考栏中有参考文献的论文我认为,由于索引对于引用列(原始数据帧)不是唯一的,
groupby
给出了奇怪的结果。

Expected output:
   Column1                                              index
0 Center for epidemiological studies depression (CESD)  [2][3]
1 Social Causes of Depression                           [1][4]
2 Depressive Realism                                    [5]

似乎您希望在
'Column1'
中找到每个唯一值的位置。执行
groupby
时,Pandas会精确跟踪
groups
属性中的索引。但是,您需要先重置索引

grp = df.reset_index(drop=True).groupby('Column1')
print(grp.groups)

{
    'Center for epidemiological studies depression (CESD)':
        Int64Index([0, 2], dtype='int64'),
    'Depressive Realism':
        Int64Index([4], dtype='int64'),
    'Social Causes of Depression':
        Int64Index([1, 3], dtype='int64')
}
我会利用这一点,将其放入这样的系列中,以便进行漂亮的打印:

pd.Series(grp.groups)

Center for epidemiological studies depression (CESD)    Int64Index([0, 2], dtype='int64')
Depressive Realism                                         Int64Index([4], dtype='int64')
Social Causes of Depression                             Int64Index([1, 3], dtype='int64')
dtype: object
或者,为了清楚起见,这也适用于:

pd.Series(range(len(df))).groupby(df.Column1.to_numpy()).apply(list)

Center for epidemiological studies depression (CESD)    [0, 2]
Depressive Realism                                         [4]
Social Causes of Depression                             [1, 3]
dtype: object
_______________________________________________________ 一个简单的python答案

d = {}
for i, r in enumerate(df.Column1):
    d.setdefault(r, []).append(i)

print(d)

{
    'Center for epidemiological studies depression (CESD)': [0, 2],
    'Social Causes of Depression': [1, 3],
    'Depressive Realism': [4]
}
我们可以使用
iloc
'Column1'

df.iloc[d['Center for epidemiological studies depression (CESD)']]

                                             Column1 Column2
0  Center for epidemiological studies depression ...       a
1  Center for epidemiological studies depression ...       a

似乎您希望在
'Column1'
中找到每个唯一值的位置。执行
groupby
时,Pandas会精确跟踪
groups
属性中的索引。但是,您需要先重置索引

grp = df.reset_index(drop=True).groupby('Column1')
print(grp.groups)

{
    'Center for epidemiological studies depression (CESD)':
        Int64Index([0, 2], dtype='int64'),
    'Depressive Realism':
        Int64Index([4], dtype='int64'),
    'Social Causes of Depression':
        Int64Index([1, 3], dtype='int64')
}
我会利用这一点,将其放入这样的系列中,以便进行漂亮的打印:

pd.Series(grp.groups)

Center for epidemiological studies depression (CESD)    Int64Index([0, 2], dtype='int64')
Depressive Realism                                         Int64Index([4], dtype='int64')
Social Causes of Depression                             Int64Index([1, 3], dtype='int64')
dtype: object
或者,为了清楚起见,这也适用于:

pd.Series(range(len(df))).groupby(df.Column1.to_numpy()).apply(list)

Center for epidemiological studies depression (CESD)    [0, 2]
Depressive Realism                                         [4]
Social Causes of Depression                             [1, 3]
dtype: object
_______________________________________________________ 一个简单的python答案

d = {}
for i, r in enumerate(df.Column1):
    d.setdefault(r, []).append(i)

print(d)

{
    'Center for epidemiological studies depression (CESD)': [0, 2],
    'Social Causes of Depression': [1, 3],
    'Depressive Realism': [4]
}
我们可以使用
iloc
'Column1'

df.iloc[d['Center for epidemiological studies depression (CESD)']]

                                             Column1 Column2
0  Center for epidemiological studies depression ...       a
1  Center for epidemiological studies depression ...       a

如果你和熊猫一起工作,你可以像下面这样做

您可以从这样的数据帧开始:

data = [['Center for epidemiological studies depression (CESD)','a'], 
        ['Center for epidemiological studies depression (CESD)','b'], 
        ['Social Causes of Depression','b'], 
        ['Social Causes of Depression','b'], 
        ['Depressive Realism', 'c']]

df = pd.DataFrame(data,
                  columns=['Column1','Column2'], 
                  index=[0,0,0,0,0])
您在数据帧上使用了groupby,但之前执行了两次重置索引

第一个将忽略当前索引,第二个将创建一个索引为0、1、2、3、

列索引将包含原始数据帧中行的位置索引

grouped = df.reset_index(drop=True).reset_index()\
            .groupby(['Column1'])['index'].apply(list).to_frame('indexes')
输出:

                                                   indexes
Column1                                                   
Center for epidemiological studies depression (...  [0, 1]
Depressive Realism                                     [4]
Social Causes of Depression                         [2, 3]
                       Column1 Column2
0  Social Causes of Depression       b
0  Social Causes of Depression       b
要添加计数,需要计算每行索引的列表长度:

grouped['count'] = grouped['indexes'].map(len)
按“计数”降序排序:

grouped = grouped.sort_values(by=['count'], ascending=False) 
如果要查看与抑郁的社会原因相对应的行,可以执行以下操作:

df.iloc[[2, 3]]
输出:

                                                   indexes
Column1                                                   
Center for epidemiological studies depression (...  [0, 1]
Depressive Realism                                     [4]
Social Causes of Depression                         [2, 3]
                       Column1 Column2
0  Social Causes of Depression       b
0  Social Causes of Depression       b

如果你和熊猫一起工作,你可以像下面这样做

您可以从这样的数据帧开始:

data = [['Center for epidemiological studies depression (CESD)','a'], 
        ['Center for epidemiological studies depression (CESD)','b'], 
        ['Social Causes of Depression','b'], 
        ['Social Causes of Depression','b'], 
        ['Depressive Realism', 'c']]

df = pd.DataFrame(data,
                  columns=['Column1','Column2'], 
                  index=[0,0,0,0,0])
您在数据帧上使用了groupby,但之前执行了两次重置索引

第一个将忽略当前索引,第二个将创建一个索引为0、1、2、3、

列索引将包含原始数据帧中行的位置索引

grouped = df.reset_index(drop=True).reset_index()\
            .groupby(['Column1'])['index'].apply(list).to_frame('indexes')
输出:

                                                   indexes
Column1                                                   
Center for epidemiological studies depression (...  [0, 1]
Depressive Realism                                     [4]
Social Causes of Depression                         [2, 3]
                       Column1 Column2
0  Social Causes of Depression       b
0  Social Causes of Depression       b
要添加计数,需要计算每行索引的列表长度:

grouped['count'] = grouped['indexes'].map(len)
按“计数”降序排序:

grouped = grouped.sort_values(by=['count'], ascending=False) 
如果要查看与抑郁的社会原因相对应的行,可以执行以下操作:

df.iloc[[2, 3]]
输出:

                                                   indexes
Column1                                                   
Center for epidemiological studies depression (...  [0, 1]
Depressive Realism                                     [4]
Social Causes of Depression                         [2, 3]
                       Column1 Column2
0  Social Causes of Depression       b
0  Social Causes of Depression       b


正如你所描述的那样。返回表示重复行的布尔序列,可以选择只考虑某些列。到目前为止,您尝试了什么?请提供您希望看到的输出。@ALOLZ您看到原始数据帧了吗(问题中给出了链接)?我已经提到索引不是唯一的,因为原始数据中的引用列对于特定的列有许多值。@piRSquared我希望这会有所帮助。但是请查看原始数据框()和所有其他链接。我认为这些链接应该被编辑掉。您在问题中提供了示例数据,由于链接包含不同的数据,我认为它们只会混淆问题。另外,您是否确定预期的输出,我认为您可能交换了一些值?正如你所描述的那样。返回表示重复行的布尔序列,可以选择只考虑某些列。到目前为止,您尝试了什么?请提供您希望看到的输出。@ALOLZ您看到原始数据帧了吗(问题中给出了链接)?我已经提到索引不是唯一的,因为原始数据中的引用列对于特定的列有许多值。@piRSquared我希望这会有所帮助。但是请查看原始数据框()和所有其他链接。我认为这些链接应该被编辑掉。您在问题中提供了示例数据,由于链接包含不同的数据,我认为它们只会混淆问题。另外,您是否确定预期的输出,我认为您可能交换了一些值?按照您的要求编辑了问题,但此anwser不会有帮助,因为groupby不处理非唯一索引。我已更新了答案。刷新页面。我使用
reset\u index
来获得一个唯一的索引。我不知道该怎么做。如果它对您的示例数据有效,但对您的真实数据无效,则表示您的真实数据不够好。是什么让你的真实数据与众不同。按照你的要求编辑了这个问题,但这个anwser没有帮助,因为groupby没有处理非唯一索引。我已经更新了答案。刷新页面。我使用
reset\u index
来获得一个唯一的索引。我不知道该怎么做。如果它对您的示例数据有效,但对您的真实数据无效,则表示您的真实数据不够好。是什么让你的真实数据与众不同呢?我在这里详细说明了为什么我会两次重置索引。我在这里详细说明了为什么我会两次重置索引。