【问题标题】:Find the index of duplicated values in dataframe column查找数据框列中重复值的索引
【发布时间】:2020-01-29 05:52:42
【问题描述】:

我有带有计数的数据框列的重复值,但我需要在整个列中找到特定重复值的索引。 查找示例数据帧的索引,因为索引不是唯一的

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
In[1]:
df_new = pd.DataFrame(df['Column1'].value_counts().values, index=df['Column1'].value_counts().index, columns=['Count'])
df_new.head()

Out[2]:
   Column1                                            Count
 Center for epidemiological studies depression (CESD)   2
 Social Causes of Depression                            2
 Depressive Realism                                     1

在这里我得到了列行的重复值,但我也想要特定重复引用的索引,但无法获取。

Here is the original duplicated values of reference column

此外,使用groupby 会产生奇怪的结果。这是actual original data values 和我在using groupby function 之后得到的。看数据,'0th' 索引是参考栏中有参考文献的第一篇论文。 我认为由于索引对于参考列(原始数据框)不是唯一的,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]

【问题讨论】:

  • dataframe.duplicated() 完全按照您的描述进行。 “返回表示重复行的布尔系列,可选择仅考虑某些列。”到目前为止,您尝试过什么?
  • 请提供您希望看到的输出。
  • @ALollz 你看过原始数据框吗(问题中给出了链接)?我已经提到索引不是唯一的,因为原始数据中的引用列对于特定列有很多值。
  • @piRSquared 我希望它有所帮助。但请查看原始数据框 (imgur.com/QONxLNr) 和所有其他链接。
  • 我认为链接应该被编辑掉。您在问题中提供了示例数据,并且由于链接包含不同的数据,我认为它们只会混淆和混淆问题。另外你确定预期的输出,我想你可能已经交换了一些值?

标签: python pandas dataframe


【解决方案1】:

您似乎想要'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

【讨论】:

  • 按照您的要求编辑了问题,但由于 groupby 不适用于非唯一索引,因此此 anwser 无济于事。
  • 我已经更新了答案。刷新页面。我使用reset_index 来获取唯一索引。
  • 我不知道该怎么做。
  • 如果它适用于您的示例数据,但不适用于您的真实数据,那么您的真实数据还不够好。您的真实数据有何不同。
【解决方案2】:

如果您正在使用 pandas,您可以执行以下操作。

你从一个像这样的 DataFrame 开始:

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])

您在 DataFrame 上使用 groupby,但之前执行了两个 reset_index。

第一个忽略当前索引,第二个创建一个索引为 0,1,2,3,... 的列

列索引将包含原始 DataFrame 中行的位置索引。

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]

要添加计数,您需要为每行索引计算列表的 len:

grouped['count'] = grouped['indexes'].map(len)

按“count”降序排列:

grouped = grouped.sort_values(by=['count'], ascending=False) 

如果你想看到Social Causes of Depression对应的行,你可以这样做:

df.iloc[[2, 3]]

输出:

                       Column1 Column2
0  Social Causes of Depression       b
0  Social Causes of Depression       b

【讨论】:

  • 我在这里详细说明了为什么我要两次 reset_index。
猜你喜欢
  • 2019-08-05
  • 2021-04-02
  • 2017-03-08
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多