我有一个名称出现在两列中的数据集(player1_name 和 player2_name 可能在不同的行中有相同的玩家):
PLAyer1_name | player2_name | 位置 |
---|---|---|
卡斯帕罗夫 | B.Fisher | 巴黎 |
卡鲁纳 | Wesley.So | 东京 |
中村 | 卡斯帕罗夫 | 圣彼得堡 |
卡鲁纳 | 中村 | 纽约 |
如果这是桌子,我想得到的是:
Kasparov 2
Caruna 2
Nakamura 2
Wesley.So 1
B. Fisher 1
基本上,2 个组合列的 value_counts()。我猜很简单,但我似乎无法理解
答案 0 :(得分:2)
试试:
return base64_encode(hash_hmac('sha256',$message,$secret_key,true));
或
out=df.melt(None,['PLayer1_name','player2_name'])['value'].value_counts()
out=df[['PLayer1_name','player2_name']].stack().droplevel(1).value_counts()
的输出:
out
答案 1 :(得分:2)
np.unique
和 return_counts=True
可能会表现得更好,因为它不需要重塑:
values, counts = np.unique(df[['PLayer1_name', 'player2_name']],
return_counts=True)
s = pd.Series(counts, index=values).sort_values(ascending=False)
s
:
Caruna 2
Kasparov 2
Nakamura 2
B.Fisher 1
Wesley.So 1
dtype: int64
一些时间信息:
import numpy as np
import pandas as pd
df_ = pd.DataFrame({
'PLayer1_name': {0: 'Kasparov', 1: 'Caruna', 2: 'Nakamura', 3: 'Caruna'},
'player2_name': {0: 'B.Fisher', 1: 'Wesley.So', 2: 'Kasparov',
3: 'Nakamura'},
'Place': {0: 'Paris', 1: 'Tokyo', 2: 'S.Petersburg', 3: 'New York'}
})
这个答案:
def fn(df):
values, counts = np.unique(df[['PLayer1_name', 'player2_name']],
return_counts=True)
return pd.Series(counts, index=values).sort_values(ascending=False)
%timeit fn(df_)
640 µs ± 13.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
def fn2(df):
return df.melt(
None, ['PLayer1_name', 'player2_name']
)['value'].value_counts()
%timeit fn2(df_)
2.05 ms ± 203 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
def fn3(df):
return (
df[['PLayer1_name', 'player2_name']].stack()
.droplevel(1).value_counts()
)
%timeit fn3(df_)
1.32 ms ± 51.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)