【问题标题】:How to get the list of values of different classes for a feature? [duplicate]如何获取功能的不同类的值列表? [复制]
【发布时间】:2022-01-01 06:59:53
【问题描述】:

我有一个数据框。我想获取不同类的所有值的列表。

df = pd.DataFrame([(3, 1),
                    (4, 3),
                    (6, 2),
                    (7, 2),
                    (2, 3),
                    (4, 2),
                    (4, 1),
                    (1, 3),
                    (6, 3),
                    (8, 1)],
                    columns=['Feature', 'Class'])

在上面的示例中,我有三个类,即 1、2 和 3。我想获得一个类中所有不同值列表的输出。输出可以如下:

Class 1: [3, 4, 8]
Class 2: [6, 7, 4]
Class 3: [4, 2, 1, 6]

【问题讨论】:

  • df.Feature.groupby(df.Class).apply(list)

标签: python pandas dataframe


【解决方案1】:

正如this 很好的答案所指出的,您可以使用pandas.DataFrame.groupby() 方法和pandas.DataFrame.apply() 方法来实现这一点:

import pandas as pd

df = pd.DataFrame([(3, 1),
                   (4, 3),
                   (6, 2),
                   (7, 2),
                   (2, 3),
                   (4, 2),
                   (4, 1),
                   (1, 3),
                   (6, 3),
                   (8, 1)],
                  columns=['Feature', 'Class'])

print(df.groupby('Class')['Feature'].apply(list))

输出:

Class
1       [3, 4, 8]
2       [6, 7, 4]
3    [4, 2, 1, 6]
Name: Feature, dtype: object

但是,如果您想逐个遍历类号,更直观的方法是使用pandas.DataFrame.loc 属性,如下所示:

print(df.loc[df['Class'] == 1])

输出:

   Feature  Class
0        3      1
6        4      1
9        8      1

或包含"Feature" 列以获取:

print(df.loc[df['Class'] == 1]["Feature"])

输出:

0    3
6    4
9    8
Name: Feature, dtype: int64

【讨论】:

    【解决方案2】:
    d = {}
    [d.setdefault(v.Class, []).append(v.Feature) for _, v in df.iterrows()]
    d
    # {1: [3, 4, 8], 3: [4, 2, 1, 6], 2: [6, 7, 4]}
    

    【讨论】:

      【解决方案3】:

      你可以简单地做到这一点:

      classes = df.groupby('Class')['Feature'].apply(list)
      

      输出:

      >>> classes
      Class
      1       [3, 4, 8]
      2       [6, 7, 4]
      3    [4, 2, 1, 6]
      Name: Feature, dtype: object
      

      你可以这样打印它们:

      >>> for class_number, items in classes.items():
      ...     print(f'Class {class_number}: {items}')
      ...
      Class 1: [3, 4, 8]
      Class 2: [6, 7, 4]
      Class 3: [4, 2, 1, 6]
      

      如果你想获得所有的唯一值,试试这个:

      unique = df.groupby('Class')['Feature'].unique()
      

      【讨论】:

      • df.groupby("Class").agg(list)
      猜你喜欢
      • 2019-12-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      相关资源
      最近更新 更多