【问题标题】:Unique values from some column, DF pandas来自某些列的唯一值,DF pandas
【发布时间】:2014-11-30 16:54:12
【问题描述】:

如果我有一些 DataFrame:

A B
1 a
1 a
1 b 
1 c
1 c
1 d
2 a
2 b
2 b
2 d

我可以使用groupby() 命令并计算每个唯一行的事件数。但是现在,我不想计算所有独特的行。我只想计算B 列中有多少唯一值对应于A 列中的某个值。我现在的输出应该是

A UniqueValuesFromB
1 4
2 3

为此我做了下一个代码:

userNumber = []
items = []
for pos in df[column].unique():
        dfEvent = df[df[column] == pos]
        userNumber.append(len(numpy.unique(dfEvent[correspondingColumn])))
        items.append(pos)

然后我从新列表中执行新的新 DF... 编写此片段的更好方法是什么。特别是,我觉得我可以在这里使用groupby() 命令或类似命令。 请只询问pythonic方式(或某些pandas函数的实现),特别是具有强大的时间性能改进。

【问题讨论】:

    标签: python pandas for-loop dataframe


    【解决方案1】:

    使用value_counts的另一种方式,这里的关键是将级别号传递给count

    In [32]:
    
    df.groupby('A')['B'].apply(pd.value_counts).count(level=0)
    Out[32]:
    A
    1    4
    2    3
    dtype: int64
    

    另一种变体:

    In [48]:
    
    df.groupby('A')['B'].agg(lambda x: pd.Series.count(x.unique()))
    Out[48]:
    A
    1    4
    2    3
    Name: B, dtype: int64
    

    【讨论】:

    • 好的,我可以通过apply函数组合value_countsgroupby函数。非常感谢!
    • 非常整洁!但是,应用 pd.value_counts 似乎比在我的机器上使用 unique 聚合要慢一些(每个循环 2.57 毫秒,而每个循环 829 微秒)。
    • @ajcr 我尝试了 100,000 行数据框,我的实现与您的实现之间的差异变为 11.4 毫秒与 8.9 毫秒。向量化的value_counts 和调用apply 之间可能存在一些战斗/权衡,可能有更好的方法,但我还没有找到更好的方法
    • @ajcr 这更接近您的 8.91ms vx 版本。 8.87 毫秒:df.groupby('A')['B'].agg(lambda x: pd.Series.count(x.unique()))
    • @EdChum Cool,感谢您在时间上发布这些替代方案;看看不同方法在性能方面的比较很有趣。
    【解决方案2】:

    使用groupby.nunique()

    >>> df.groupby("A")["B"].nunique()
    A
    1    4
    2    3
    Name: B, dtype: int64
    

    【讨论】:

    • 有一个内置的unique 属性,因此可以这样重写:df.groupby('A')['B'].unique().apply(lambda x: len(x))
    猜你喜欢
    • 2023-01-14
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2022-11-24
    • 2021-05-12
    • 2018-11-05
    相关资源
    最近更新 更多