【问题标题】:Creating a column in a pandas dataframe containing the number elements in the group (groupby)在包含组中数字元素的熊猫数据框中创建一列(groupby)
【发布时间】:2017-06-25 19:21:02
【问题描述】:

我正在分析一个大型数据集,其中包含每个主题的可变数量的观察结果(范围从 1 次出现到 26 次出现......)。由于我需要分析事件之间的时间,因此仅出现一次的主题是非信息性的。

以前,在 Stata 中工作时,我会使用 Stata 代码分配一个变量(例如,total):

按 idnummer 排序:gen total=_N

通过这种方式,每行/主题都有一个变量“总计”,我可以消除所有主题总计=1。

我一直在尝试使用 agg 函数和大小,但最终得到 'NaN'...

PS:使用旁边的“类似问题”我已经找到了我自己问题的答案......

df['total'] = df.groupby('idnummer')['sequence'].transform('max')

【问题讨论】:

    标签: python pandas grouping stata


    【解决方案1】:

    首先,您的问题令人困惑。考虑编辑它以使其清晰。

    其次,IIUC,您希望消除包含仅在该列中出现一次的列中的值的行。

    设置
    考虑数据框中的示例数据df

    import pandas as pd
    import numpy as np
    from string import ascii_uppercase
    
    np.random.seed([3,1415])
    df = pd.DataFrame(dict(mycol=np.random.choice(list(ascii_uppercase), 50)))
    

    pd.value_counts
    我们可以在这个解决方案和其他解决方案中使用mycol 列中每个元素的频率。

    vc = df.mycol.value_counts()
    vc
    
    N    5
    H    4
    X    4
    W    4
    L    3
    M    3
    A    3
    T    3
    F    2
    Z    2
    E    2
    S    2
    C    2
    D    2
    Y    2
    U    2
    Q    1
    G    1
    K    1
    P    1
    I    1
    Name: mycol, dtype: int64
    

    选项 1
    pd.value_countsmap

    我们可以看到['Q', 'G', 'K', 'P', 'I'] 都是单次出现。使用mapmycol 转换为相对计数并过滤。

    df[df.mycol.map(vc) > 1]
    

    选项 2
    np.bincountnp.unique

    f = np.unique(df.mycol.values, return_inverse=True)[1]
    df[np.bincount(f)[f] > 1]
    

    【讨论】:

      【解决方案2】:

      您实际上并不需要 groupby,只计算每个字符串的出现次数会更简单一些:

      df['total'] = df.idnumber.apply(lambda x: df.idnumber.str.count(x).sum())
      

      或者您也可以像这样映射值计数:

      df['total'] = df.idnumber.map(df.idnumber.value_counts())
      

      【讨论】:

        猜你喜欢
        • 2021-02-08
        • 2022-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2017-08-30
        相关资源
        最近更新 更多