我如何创建 pivot_table 和 pandas,其中显示了我用于索引的其他字段

How can i create pivot_table with pandas, where displayed other fields than i use for index

我为 python 使用包 "pandas"。我有一个问题。 我有这样的数据框:

|  first  |  last  |  datr  |city|
|Zahir    |Petersen|22.11.15|9   |
|Zahir    |Petersen|22.11.15|2   |
|Mason    |Sellers |10.04.16|4   | 
|Gannon   |Cline   |29.10.15|2   |
|Craig    |Sampson |20.04.16|2   |
|Craig    |Sampson |20.04.16|4   |
|Cameron  |Mathis  |09.05.15|6   |
|Adam     |Hurley  |16.04.16|2   |
|Brock    |Vaughan |14.04.16|10  |
|Xanthus  |Murray  |30.03.15|6   |
|Xanthus  |Murray  |30.03.15|7   |
|Xanthus  |Murray  |30.03.15|4   |
|Palmer   |Caldwell|31.10.15|2   |

我想通过字段 ['first'、'last'、'datr'] 创建 pivot_table,但显示 ['first', 'last', 'datr','city'] 其中记录计数 ['first', 'last', 'datr'] 更多比一个,像这样:

|  first  |  last  |  datr  |city| 
|Zahir    |Petersen|22.11.15|9   | 2
|         |        |        |2   | 2
|Craig    |Sampson |20.04.16|2   | 2
|         |        |        |4   | 2
|Xanthus  |Murray  |30.03.15|6   | 3
|         |        |        |7   | 3
|         |        |        |4   | 3 

更新。 如果我从四个字段中分组三个字段,那么

df['count'] = df.groupby(['first','last','datr']).transform('count') 

有效,但如果 所有列的计数 - "groupby" 的列 > 1 比此代码抛出错误。例如(所有列 - 4('first','last','datr','city'),groupby 的列 - 2('first','last' ), 4-2 = 2:

In [181]: df['count'] = df.groupby(['first','last']).transform('count') 
...
ValueError: Wrong number of items passed 2, placement implies 1

您可以使用 groupby 执行此操作。按三列(first、last和datr)分组,然后统计每组的元素个数:

In [63]: df['count'] = df.groupby(['first', 'last', 'datr']).transform('count')

In [64]: df
Out[64]:
        first      last      datr  city  count
0   Zahir      Petersen  22.11.15     9      2
1   Zahir      Petersen  22.11.15     2      2
2   Mason      Sellers   10.04.16     4      1
3   Gannon     Cline     29.10.15     2      1
4   Craig      Sampson   20.04.16     2      2
5   Craig      Sampson   20.04.16     4      2
6   Cameron    Mathis    09.05.15     6      1
7   Adam       Hurley    16.04.16     2      1
8   Brock      Vaughan   14.04.16    10      1
9   Xanthus    Murray    30.03.15     6      3
10  Xanthus    Murray    30.03.15     7      3
11  Xanthus    Murray    30.03.15     4      3
12  Palmer     Caldwell  31.10.15     2      1

从那里,您可以过滤框架:

In [65]: df[df['count'] > 1]
Out[65]:
        first      last      datr  city  count
0   Zahir      Petersen  22.11.15     9      2
1   Zahir      Petersen  22.11.15     2      2
4   Craig      Sampson   20.04.16     2      2
5   Craig      Sampson   20.04.16     4      2
9   Xanthus    Murray    30.03.15     6      3
10  Xanthus    Murray    30.03.15     7      3
11  Xanthus    Murray    30.03.15     4      3

如果您希望这些列作为索引(如您问题中的示例输出):df.set_index(['first', 'last', 'datr'])