【问题标题】:count the number of occurrences using in a pandas pivot table计算在熊猫数据透视表中使用的出现次数
【发布时间】:2020-10-05 15:32:51
【问题描述】:

我有一个看起来像这样的 df(5m 行和大约 250 个不同的条约编号(都是字符串)):

      Id   Name    Treaty Number
 0  Id88   Jack              x12
 1  Id87   John              x33
 2  Id88    Jim              x22
 3  Id11   Hans              x12
 4  Id12   Ivan              x33
 5  Id88   Sara              x22
 6  Id11    Max              x12
 7  Id11  Peter              x33

我想查找所有重复的 ID 以及属于该 ID 的每个条约编号的计数。

完美,它看起来像这样:

           Sum  
   Id88      3    x12: 1, x22:2, ....
   Id11      3    x12: 2, x33:1,...

现在我有以下代码:

    import pandas as pd
    import numpy as np

    data = np.array([
    ['Id88', 'Jack', 'x12'], 
    ['Id87', 'John', 'x33'], 
    ['Id88', 'Jim', 'x22'],
    ['Id11', 'Hans', 'x12'],
    ['Id12', 'Ivan', 'x33'],
    ['Id88', 'Sara', 'x22'],
    ['Id11', 'Max', 'x12'],
    ['Id11', 'Peter', 'x33'],
    ])
    columns=['Id', 'Name', 'Treaty Number']

    df = pd.DataFrame(data= data, columns = columns)

    dublicateIDs = df[df.duplicated(subset=['Id'],keep=False )]

    pivotIDs = dublicateIDs.pivot_table(index=['Id'], aggfunc='size')
    pivotIDs = pivotIDs.sort_values(ascending=False)

    pivotTreaty = dublicateIDs.pivot_table(index=['Id'], columns = 'Treaty Number', aggfunc='size', 
    fill_value=0)

    concatDF = [pivotIDs, pivotTreaty]
    pivotIDsCombine = pd.concat(concatDF, axis=1, sort=False)
    columnNames = pivotIDsCombine.columns.tolist()
    columnNames[0] = 'Sum'
    pivotIDsCombine.columns = columnNames
    print(pivotIDsCombine)

结果如下:

         Sum  x12  x22  x33
 Id88      3    1    2    0
 Id11      3    2    0    1

由于大量的行 (5m) 和条约编号 (250) 以及每个 ID 的条约数量很少,我有一个巨大的表格,里面装满了 NaN(或零)。

有没有一种简单的方法使用数据透视表来达到所需的格式,或者我应该循环每列/行并手动计算出现次数?

【问题讨论】:

  • 您可以接受字典,还是需要数​​据框作为输出?
  • 字典也可以,我更喜欢 df,因为这样我可以轻松地将其保存为 csv
  • 你可以很容易地拥有这样的数据透视表:pd.pivot_table(df, index='Id', columns='Treaty Number', aggfunc='count') 它需要更多的工作来处理重复列。你想让我工作吗?结果将与上述结果相似(每 x.. 数字一列)
  • 我可以轻松删除重复项并使用您为我编写的 pivot_table 语句。我的问题是如何只留下值不同于 0(NaN) 的条约编号,如下所示:Id11 3 x12: 2, x33:1,...

标签: python pandas numpy dataframe


【解决方案1】:

这应该可以帮助你

df['temp'] = 1
df1 = df.groupby(['Id', 'Treaty Number'])['temp'].count().reset_index()
df1 = df1.pivot_table(index='Id', columns='Treaty Number')
df1.columns = df1.columns.droplevel()
df1.columns.name = None
df1.fillna(0, inplace=True)
df1['Sum'] = df1.sum(axis=1)

【讨论】:

  • 其实不是。它给了我与我已经拥有的结果相似的结果。我想要的是这种形式的结果: Sum Id88 3 x12: 1, x22:2, .... Id11 3 x12: 2, x33:1,...
猜你喜欢
  • 2018-08-29
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2019-05-13
相关资源
最近更新 更多