计算熊猫熊猫中2个不同列的唯一名称

时间:2021-07-01 16:13:20

标签: python pandas

我有一个名称出现在两列中的数据集(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()。我猜很简单,但我似乎无法理解

2 个答案:

答案 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.uniquereturn_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)

Anurag Dabas's melt option

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)

Anurag Dabas's stack option

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)