熊猫数据框按特定值分组

时间:2019-11-22 21:35:06

标签: python pandas dataframe group-by

假设我有一个如下所示的交易熊猫数据框:

+----------+----------+----------+---------+
|  Owner   |  Seller  | Mediator |  Buyer  |
+----------+----------+----------+---------+
| 'andrew' | 'bob'    | 'tom'    | 'john'  |
| 'andrew' | 'andrew' | 'bill'   | 'jason' |
| 'andrew' | 'bill'   |  'bill'  | 'tom'   |
+----------+----------+----------+---------+

我要执行一个奇怪的分组依据-我想根据交易中的参与情况按人员姓名分组。因此输出为:

+----------+-------+
|   Name   | Count |
+----------+-------+
| 'andrew' |     3 |
| 'bob'    |     1 |
| 'tom'    |     2 |
| 'john'   |     1 |
| 'bill'   |     2 |
| 'jason'  |     1 |
+----------+-------+

即,“安德鲁”的计数为3,因为他的名字出现在3个交易中,“约翰”的计数为1,因为他的名字仅出现在1个交易中,等等。

有什么技巧可以做到这一点吗?预先感谢

3 个答案:

答案 0 :(得分:2)

您可以使用 unstack() 进行以下操作:

  1. 将所有名称放入一列
  2. groupby Name 并计数 unique original-index ,即 level_1 unstack() reset_index() 之后:
    (df.unstack()
       .reset_index(name='Name')
       .groupby('Name') 
       .level_1 
       .nunique() 
       .rename('Count') 
       .reset_index())

    #Out[xx]:
    #     Name  Count
    #0  andrew      3
    #1    bill      2
    #2     bob      1
    #3   jason      1
    #4    john      1
    #5     tom      2

答案 1 :(得分:1)

您可以从每一行创建一个集合,然后将其整形为垂直数据堆栈并获取值计数。

import pandas as pd

df = pd.DataFrame({'Owner': ['andrew', 'andrew', 'andrew'],
 'Seller': ['bob', 'andrew', 'bill'],
 'Mediator': ['tom', 'bill', 'bill'],
 'Buyer': ['john', 'jason', 'tom']}
)

cnt = (
    df.apply(lambda r: pd.Series(list(set(r))), axis=1)
      .stack()
      .value_counts()
      .reset_index().rename(columns={'index': 'Name', 0: 'Count'})
)
cnt
# returns:
     Name  Count
0  andrew      3
1    bill      2
2     tom      2
3   jason      1
4    john      1
5     bob      1

答案 2 :(得分:1)

带有'unique()'的解决方案:

df.apply(lambda row: row.unique(),axis=1) \
  .explode().value_counts() \
  .to_frame(name="Count")  \
  .rename_axis(["Name"])      

        Count
Name         
andrew      3
bill        2
tom         2
john        1
bob         1
jason       1