【问题标题】:How to check if a value is unique in a specific pandas dataframe column如何检查特定熊猫数据框列中的值是否唯一
【发布时间】:2019-11-22 06:32:46
【问题描述】:

我需要检查一个特定值是否多次存在于 pandas 数据框列中。这是基本代码;

for index, row in df_x.iterrows():
    try:
        if row[1] in df_y['b'].values:  

# if row[1] exists in df_y i want to know how many time is it repeated, or if it is unique or not

    except Exception as e:
        print('Error ', e)

【问题讨论】:

  • 你看过df_y['b'].value_counts()吗?
  • 我试过 v_counts = df['Column Name'].value_counts() 但不知道如何检查 row1 是否存在以及出现了多少次
  • v_counts[your_values] 的输出是什么?

标签: python pandas dataframe duplicates unique


【解决方案1】:

你有一个由 df 命名的 DataFrame 所以你想知道以“spec_col”命名的特定列包含唯一值

import pandas as pd

pd.Series(df["spec_col"]).is_unique
>>> True 

【讨论】:

  • 我猜想转换为pd.Series 甚至没有必要,所以df['spec_col'].is_unique 已经可以工作了吗?
【解决方案2】:

Pandas 可以帮助您避免 for 循环。 Pandas 提供了许多功能来帮助您实现这一目标

例如

import pandas as pd

# data

df = pd.DataFrame({'uni':[1,2,3,4],'not_uni':[2,2,1,3]})

# value_counts

print(df['uni'].value_counts())
print(df['not_uni'].value_counts())

这将计算值。唯一值将具有 if 1,非唯一值将具有大于 1 的值。

正如您在 uni 列中看到的那样,我们只有 1,因为没有重复值,所以在 not_uni 列中我们有 2 重复两次。

【讨论】:

    【解决方案3】:

    如果您特别关心第一行中的值出现了多少次:

    np.random.seed(2)
    df = pd.DataFrame({'a':np.random.rand(10) // .1,
                        'b':np.random.rand(10) // .01,
                        'c':np.random.choice(['A','B','C', 'D', 'E'], 10)})
    df['c'].value_counts()[df.loc[0,'c']]
    

    df

         a     b  c
    0  7.0  11.0  B
    1  5.0  14.0  D
    2  1.0  85.0  A
    3  3.0  50.0  C
    4  4.0  21.0  B
    5  6.0  99.0  E
    6  7.0  31.0  A
    7  6.0  25.0  B
    8  6.0  80.0  B
    9  9.0  35.0  B
    

    df['c'].value_counts()[df.loc[0,'c']] 返回5(非唯一),而 df['c'].value_counts()[df.loc[5,'c']] 返回1。如果您尝试查找的行是np.nan 等,您可能需要添加一些异常处理。

    【讨论】:

      【解决方案4】:

      您可以使用Series/Dataframe 方法isin 后跟sum 来计算出现次数。

      用你的例子:

      for index, row in df_x.iterrows():
          try:
              count = df_y['b'].isin([row[1]]).sum()
              print("df_y['b'] contains {} times the value {}".format(count, row[1])) 
      
          except Exception as e:
              print('Error ', e)
      

      但是,这并不是真正有效的,因为您将针对row[1] 的每个值遍历df_yb 列。

      首先,您可以在父列中使用unique 以避免多次计算相同的值,其次使用带有value_counts 的东西可以避免很多循环。你可以让你的问题更清楚一点,这样我们就可以确切地知道你在追求什么,因为这对我来说并不是很清楚。

      【讨论】:

        【解决方案5】:

        以下代码将在col 列中为您提供重复值:

        list(df["col"].value_counts()[df["col"].value_counts() > 1].index)
        

        【讨论】:

        • 你能检查一下@aruydzi1的答案吗?
        【解决方案6】:

        我也需要这样做,但我想还有更好的方法,比如首先更好地清理和修改你的 pandas 数据框。

        无论如何,这是我的解决方案

        np.sum(df[df['col_name'] == value]['col_name'].value_counts())

        这将为您提供 col_name 列中重复值 (value) 的计数。

        【讨论】:

          猜你喜欢
          • 2018-08-03
          • 1970-01-01
          • 1970-01-01
          • 2020-03-18
          • 2020-05-08
          • 1970-01-01
          • 2019-08-14
          • 2022-01-01
          • 2018-08-16
          相关资源
          最近更新 更多