【问题标题】:How to count frequency of select values in Python pandas dataframe如何计算 Python pandas 数据框中选择值的频率
【发布时间】:2019-12-23 05:11:13
【问题描述】:

我有一个包含两列的数据框,一列用于名称,另一列用于字符串值。 我正在尝试按名称计算选择字符串值的频率。

我已经尝试过 pandas.pivot_table 和 pandas.DataFrame.groupby,但我想创建一个全新的数据框而不是聚合。

例如,我有一个数据框:

import pandas as pd
import numpy as np

data = np.array([['John', 'x'], ['John', 'x'], ['John', 'x'], ['John', 'y'], ['John', 'y'], ['John', 'a'], 
                 ['Will', 'x'], ['Will', 'z']])

df = pd.DataFrame(data, columns=['name','str_value'])
df

导致:

   name      str_value
0  John              x
1  John              x
2  John              x
3  John              y
4  John              y
5  John              a
6  Will              x
7  Will              z

预期的结果是:

   name        x        y        z
0  John        3        2        0 
1  Will        1        0        1  

另外:

   name        x        y        z
0  John     True     True    False 
1  Will     True    False     True   

我只想选择 x、y、z 并根据返回值是 0 还是 NaN 返回 True 或 False。

编辑: 谢谢你的回答。 这些效果很好,但输出有子组“str_value”:

str_value     x      y      z
name
John       True   True  False
Will       True  False   True

有没有办法删除它,所以我在同一级别上有“name”、“x”、“y”、“z”? 使用 .reset_index() 我得到:

str_value  name     x      y      z
0          John  True   True  False
1          Will  True  False   True

我的索引名称现在是“str_value”吗?我可以重命名或删除它吗?

【问题讨论】:

    标签: python dataframe frequency


    【解决方案1】:

    除了其他出色的答案外,您还可以使用groupby unstackastype(bool) 的组合作为一个衬里:

    df1 = df.loc[df.str_value != 'a'] # remove a as requested.
    df2 = df1.groupby(["name", "str_value"])["str_value"].count().unstack().fillna(False).astype(
    bool)
    print(df2)
        name    x   y   z
    0   John    True    True    False
    1   Will    True    False   True
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      df.groupby(["name", "str_value"]).size().unstack()[['x', 'y', 'z']].gt(0)
      

      解释

      1. 使用groupbysize 计算每个namestr_value 的出现次数:
      print(df.groupby(["name", "str_value"]).size())
      # John  a            1
      #       x            3
      #       y            2
      # Will  x            1
      #       z            1
      # dtype: int64
      
      1. unstack取消堆叠
      print(df.groupby(["name", "str_value"]).size().unstack())
      # str_value    a    x    y    z
      # name
      # John       1.0  3.0  2.0  NaN
      # Will       NaN  1.0  NaN  1.0
      
      1. 选择所需的列:
      print(df.groupby(["name", "str_value"]).size().unstack()[['x', 'y', 'z']])
      # str_value    x    y    z
      # name
      # John       3.0  2.0  NaN
      # Will       1.0  NaN  1.0
      
      1. 将大于 0 的值与gt 进行比较:
      result = df.groupby(["name", "str_value"]).size().unstack()[['x', 'y', 'z']].gt(0)
      print(result)
      # str_value     x      y      z
      # name
      # John       True   True  False
      # Will       True  False   True
      

      【讨论】:

        【解决方案3】:

        混合使用groupbypivot

        total = df.groupby(["name", "str_value"]).size().reset_index(level=1, name="total")
        counts = total.pivot(columns="str_value", values="total").fillna(0).drop(columns=["a"])
        bools = counts > 0.0
        

        【讨论】:

          猜你喜欢
          • 2016-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-28
          相关资源
          最近更新 更多