假设我有一个如下所示的交易熊猫数据框:
+----------+----------+----------+---------+
| 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个交易中,等等。
有什么技巧可以做到这一点吗?预先感谢
答案 0 :(得分:2)
您可以使用 unstack() 进行以下操作:
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