如何使用 Pandas 进行数据分析(如计数、ucounts、频率)?

Sil*_* He 6 python data-analysis pandas pandas-groupby

我有如下 DataFrame:

df = pd.DataFrame([
    ("i", 1, 'GlIrbixGsmCL'),
    ("i", 1, 'GlIrbixGsmCL'),
    ("i", 1, '3IMR1UteQA'),
    ("c", 1, 'GlIrbixGsmCL'),
    ("i", 2, 'GlIrbixGsmCL'),
], columns=['type', 'cid', 'userid'])
Run Code Online (Sandbox Code Playgroud)

预期输出如: 期待输出

更多细节:

i_counts, c_counts      => df.groupby(["cid","type"]).size()
i_ucounts, c_ucounts    => df.groupby(["cid","type"])["userid"].nunique()
i_frequency,u_frequency => df.groupby(["cid","type"])["userid"].value_counts()
Run Code Online (Sandbox Code Playgroud)

看起来对我来说有点复杂,如何使用pandas来获得预期的结果?

相关截图: 截图

Nk0*_*k03 0

脚步:

  1. 提取id_numbersfromuser_id并将其转换为int type.
  2. 使用groupbyagg来评估count// ucount`频率。
  3. 用于pivot重组表。
  4. reset_index如果需要,压平列。
df['userid'] = df.userid.str.extract(r'(\d+)').astype(int)
k = df.groupby(["type", 'cid']).agg(count=('userid', 'count'), ucount=(
    'userid', 'nunique'), frequency=('userid', lambda x: x.value_counts().to_dict())).reset_index()
k = k.pivot(index=[k.index, 'cid'], columns='type').fillna(0)
Run Code Online (Sandbox Code Playgroud)

输出:

      count      ucount      frequency              
type      c    i      c    i         c             i
  cid                                               
0 1     1.0  0.0    1.0  0.0    {1: 1}             0
1 1     0.0  3.0    0.0  2.0         0  {1: 2, 2: 1}
2 2     0.0  1.0    0.0  1.0         0        {1: 1}
Run Code Online (Sandbox Code Playgroud)

然后转换列:

k.columns = k.columns.map(lambda x: '_'.join(x[::-1]))
Run Code Online (Sandbox Code Playgroud)

输出:

       c_count  i_count  c_ucount  i_ucount c_frequency   i_frequency
  cid                                                                
0 1        1.0      0.0       1.0       0.0      {1: 1}             0
1 1        0.0      3.0       0.0       2.0           0  {1: 2, 2: 1}
2 2        0.0      1.0       0.0       1.0           0        {1: 1}
Run Code Online (Sandbox Code Playgroud)

更新的答案(根据您编辑的问题):

k = df.groupby(["type" , 'cid']).agg(count = ('userid' ,'count') , ucount = ('userid', 'nunique') , frequency=('userid', lambda x: x.value_counts().to_dict())).reset_index()
k = k.pivot(index=['cid'], columns ='type').fillna(0)
Run Code Online (Sandbox Code Playgroud)

输出:

    count   ucount  frequency
type    c   i   c   i   c   i
cid                     
1   1.0 3.0 1.0 2.0 {'userid001': 1}    {'userid001': 2, 'userid002': 1}
2   0.0 1.0 0.0 1.0 0   {'userid001': 1}
Run Code Online (Sandbox Code Playgroud)

NOTE:如果需要,可用于df.userid = df.userid.factorize()[0]编码userid