打印 pandas dataframe 中每一列的唯一值

88

我有一个数据框(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))

1
你的打印语句缺少一个闭合括号,这就是导致错误的原因。 - Marius
14个回答

126

可以更简洁地写成这样:

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

通常情况下,您可以通过索引使用[]运算符(例如df['col'])或通过属性(例如df.col)访问DataFrame的列。
当目标列名已知时,属性访问使代码更加简洁,但有几个注意点--例如,当列名不是有效的Python标识符(例如df.123)或与内置DataFrame属性(例如df.index)冲突时,它将无法工作。另一方面,[]表示法应始终有效。

哦,太棒了!那么,在引用数据报中的变量时,如果列是一个变量,那么在 df.col-name 中不需要包含点号吗? - yoshiserry
@yoshiserry:通常你可以使用点符号访问列:df.my_col,或者使用索引符号,将列名作为字符串:df['my_col']。你似乎有点混淆了这两种方法。 - Marius
谢谢Marius,当我使用索引符号时,我遇到了语法错误(请参见编辑)。 - yoshiserry
当我写下这段代码时,出现了语法错误,只提示“无效的语法”,没有具体信息。不过这是否意味着可以使用相同的原则将大型数据框分割为多个较小的数据框(每年一个)?month = df.month.unique().tolist() for item in month: [item] = df[df[month]==[item]] - yoshiserry
关于错误,请将其添加到您的问题中,以便我们提供帮助。对于第二部分,您可能正在寻找类似groupby的东西(如果必要,请另外提出一个问题,而不是在此处讨论:-)。 - YS-L
不,我想创建多个独立的数据框,而不是使用(groupby)。除了引用我在导入时创建的df外,我还想能够一次只引用一个月的数据,(这就是为什么我想要一个单独的1月,2月,3月等数据框的原因)。 - yoshiserry

23

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

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

1
问题要求唯一值,而不是唯一值的数量,所以只需要更改应用的函数: print(df.apply(lambda col: col.unique())) - Philipp HB
2
当我这样做时,我会收到错误消息“数组必须具有相同的长度”。所有列都具有相同数量的行,为什么会出现这种消息? - TokyoToo
1
为了让值的输出看起来更好(至少在我看来),可以添加类似于 df.apply(lambda col: ', '.join(map(str, col.unique()))) 的内容。 - antike

12

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

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

短而精确。 - metinsenturk

5
如果您正在尝试创建多个单独的数据框,就像在您的评论中提到的那样,请创建一个数据框字典:
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]

4

我也在寻找解决这个问题的方法,而下面的代码在我的情况下证明更加有用:

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]

这对我的情况也很有帮助。谢谢! - daniness

4
我们可以更加简洁:
df.describe(include='all').loc['unique', :]

Pandas的describe函数提供了每一列数据的关键统计信息,但我们可以只选择“唯一值”这个统计量。请注意,对于数值类型的列,这会提供一个NaN的唯一计数 - 如果你想包含这些列,你可以使用如下方法:
df.astype('object').describe(include='all').loc['unique', :]

2
这也提供了唯一值的数量,而不仅仅是唯一值本身。顺便说一下,唯一值的数量可以像df.nunique()一样更容易地获得。 - antike

2
下面的代码可以为每个字段提供一个唯一值列表,当您想更深入地查看数据框时,我发现它非常有用:
Original Answer翻译成"最初的回答"
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()))

1
cu = []
i = []
for cn in card.columns[:7]:
    cu.append(card[cn].unique())
    i.append(cn)

pd.DataFrame( cu, index=i).T

1

只需要这样做:

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

0
更好的是,这里有一段代码可以将所有唯一值作为数据框列逐列转置查看:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接