【问题标题】:print the unique values in every column in a pandas dataframe打印熊猫数据框中每一列的唯一值
【发布时间】:2015-01-30 05:13:18
【问题描述】:

我有一个数据框 (df),想打印数据框中每一列的唯一值。

我需要将变量 (i) [列名] 替换到打印语句中

column_list = df.columns.values.tolist()
for column_name in column_list:
    print(df."[column_name]".unique()

更新

当我使用这个时:我得到 “Unexpected EOF Parsing” 没有额外的细节。

column_list = sorted_data.columns.values.tolist()
for column_name in column_list:
      print(sorted_data[column_name].unique()

你的语法 YS-L(上面)和下面有什么区别:

for column_name in sorted_data:
      print(column_name)
      s = sorted_data[column_name].unique()
      for i in s:
        print(str(i))

【问题讨论】:

  • 您的打印语句中缺少右括号,这就是导致错误的原因。

标签: python for-loop pandas


【解决方案1】:

可以更简洁地写成这样:

for col in df:
    print(df[col].unique())

通常,您可以通过indexing 使用[] 运算符(例如df['col'])或通过attribute(例如df.col)访问DataFrame 的列。

当预先知道目标列名时,属性访问使代码更加简洁,但有几个警告——例如,当列名不是有效的 Python 标识符时(例如df.123),它不起作用, 或与内置 DataFrame 属性冲突(例如df.index)。另一方面,[] 表示法应该始终有效。

【讨论】:

  • 啊太棒了,所以当引用作为数据报一部分的变量时,当列是变量时,您不包括 df.col-name 之前的点?!
  • @yoshiserry:通常您可以使用点表示法访问列:df.my_col 索引表示法,列名称为字符串:df['my_col']。你似乎把两者混为一谈了。
  • 感谢 Marius,当我使用索引表示法时,出现语法错误(请参阅编辑)。
  • YS-L 我在写这个的时候遇到了一个语法错误,它只是说“无效的语法”并且没有细节。然而,这是否意味着可以使用相同的原则将大型数据帧拆分为多个较小的数据帧(一年中的每个月一个?)。月份 = df.month.unique().tolist() 用于月份中的项目:[item] = df[df[month]==[item]]
  • 对于错误,请将其添加到您的问题中,以便我们提供帮助。对于第二部分,您可能正在寻找类似 @​​987654323@ 的内容(如有必要,请为此打开另一个问题,而不是在这里讨论 :-)。
【解决方案2】:

如果您尝试创建多个单独的数据框,如您的 cmets 中所述,请创建一个数据框字典:

df_dict = dict(zip([i for i in df.columns] , [pd.DataFrame(df[i].unique(), columns=[i]) for i in df.columns]))

然后您可以使用列的名称轻松访问任何数据框:

df_dict[column name]

【讨论】:

    【解决方案3】:
    cu = []
    i = []
    for cn in card.columns[:7]:
        cu.append(card[cn].unique())
        i.append(cn)
    
    pd.DataFrame( cu, index=i).T
    

    【讨论】:

      【解决方案4】:

      我们可以让它更简洁:

      df.describe(include='all').loc['unique', :]
      

      Pandas describe 提供了关于每一列的一些关键统计信息,但我们可以只获取“唯一”统计信息并保留它。

      请注意,这将为数字列提供 NaN 的唯一计数 - 如果您还想包含这些列,您可以执行以下操作:

      df.astype('object').describe(include='all').loc['unique', :]
      

      【讨论】:

      • 这也给出了唯一值的数量,而不是唯一值本身。顺便说一句,唯一值的数量更容易获得,例如df.nunique()
      【解决方案5】:

      或者简而言之可以写成:

      for val in df['column_name'].unique():
          print(val)
      

      【讨论】:

        【解决方案6】:

        下面的代码可以为您提供每个字段的唯一值列表,当您想更深入地查看数据框时,我发现它非常有用:

        for col in list(df):
            print(col)
            print(df[col].unique())
        

        如果您希望对唯一值进行排序,也可以对它们进行排序:

        import numpy as np
        for col in list(df):
            print(col)
            print(np.sort(df[col].unique()))
        

        【讨论】:

          【解决方案7】:

          最好的方法:

          Series.unique()
          

          例如 students.age.unique() 输出将是学生数据框的年龄列中出现的不同值。

          只获取多少个不同值的数量:

          Series.nunique()
          

          【讨论】:

          • 这并没有回答如何从每一列中获取唯一值
          【解决方案8】:

          最受欢迎的答案是循环解决方案,因此使用 pandas apply() 方法和 lambda 函数添​​加了一个单行解决方案。

          print(df.apply(lambda col: col.unique()))
          

          【讨论】:

          • 问题是要求唯一值,而不是唯一值的数量,所以只需更改应用函数:print(df.apply(lambda col: col.unique()))
          • 当我这样做时,我收到错误消息arrays must be the same length。所有列的数量或行数都相同,为什么我会收到该消息?
          • 为了使打印出来的值更好一些(至少在我看来)可以添加类似df.apply(lambda col: ', '.join(map(str, col.unique())))
          【解决方案9】:

          只需这样做:

          for i in df.columns:
              print(df[i].unique())
          

          【讨论】:

            【解决方案10】:

            这将以正确的格式获得唯一值:

            pd.Series({col:df[col].unique() for col in df})
            

            【讨论】:

              【解决方案11】:

              更好。以下代码将所有唯一值视为按列转置的数据框:

              columns=[*df.columns]
              unique_values={}
              for i in columns:
                  unique_values[i]=df[i].unique()
              unique=pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in unique_vals.items() ]))
              unique.fillna('').T
              

              【讨论】:

                【解决方案12】:

                我也在寻找解决这个问题的方法,下面的代码证明对我的情况更有帮助,

                for col in df:
                    print(col)
                    print(df[col].unique())
                    print('\n')
                

                它给出如下内容:

                Fuel_Type
                ['Diesel' 'Petrol' 'CNG']
                
                
                HP
                [ 90 192  69 110  97  71 116  98  86  72 107  73]
                
                
                Met_Color
                [1 0]
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-08-16
                  • 2020-10-01
                  • 2018-06-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多