python - Pandas Efficient Count 列中的唯一值然后找到该计数的最大值

标签 python pandas

数据框 (df) 如下所示:

    Date                Caller  Called
0   2011-01-01 00:00:00 Sarah   Claire
1   2011-01-01 00:00:00 Sarah   Ryan
2   2011-01-01 00:00:00 Sarah   Alex
3   2011-01-02 00:00:00 Sarah   Max
4   2011-01-02 00:00:00 Sarah   Phoebe


number_date =  df.groupby(['Caller',pd.DatetimeIndex(df['Date']).normalize()])
number_date['Called'].unique().apply(lambda x: len(x))

这符合我的预期。她在第 1 天打了 3 个电话,在第 2 天打了 2 个电话:

Caller            
Sarah   2011-01-01    3
        2011-01-02    2

如何修改为:

Caller   MaxCallsOneDay
Sarah    3

最佳答案

你可以试试nuniquenlargest :

print df
        Date  Caller  Called
0 2011-01-01   Sarah  Claire
1 2011-01-01   Sarah    Ryan
2 2011-01-01  Sarah1    Ryan
3 2011-01-01  Sarah1   Ryan1
4 2011-01-01  Sarah1    Ryan
5 2011-01-01   Sarah    Alex
6 2011-01-02   Sarah     Max

number_date=df.groupby(['Caller',pd.DatetimeIndex(df['Date']).normalize()])['Called'].nunique()
              .groupby(level=0).nlargest(1).reset_index(level=1, drop=True).reset_index()

number_date.columns = ['Caller','Date', 'MaxCallsOneDay']
print number_date
   Caller       Date  MaxCallsOneDay
0   Sarah 2011-01-01               3
1  Sarah1 2011-01-01               2

如果您不需要 Date 列,请使用 max :

df = df.groupby(['Caller',pd.DatetimeIndex(df['Date']).normalize()])['Called'].nunique()
       .groupby(level=0).max().reset_index(name='MaxCallsOneDay')
print df
   Caller  MaxCallsOneDay
0   Sarah               3
1  Sarah1               2

时间 - len(df) = 7k:

In [531]: %timeit df.groupby(['Caller',pd.DatetimeIndex(df['Date']).normalize()])['Called'].unique().apply(lambda x: len(x)).groupby(level=0).nlargest(1).reset_index(level=1, drop=True).reset_index()
The slowest run took 4.80 times longer than the fastest. This could mean that an intermediate result is being cached 
10 loops, best of 3: 8.58 ms per loop

In [532]: %timeit df.groupby(['Caller',pd.DatetimeIndex(df['Date']).normalize()])['Called'].nunique().groupby(level=0).nlargest(1).reset_index(level=1, drop=True).reset_index()
100 loops, best of 3: 7.07 ms per loop

In [547]: %timeit df.groupby(['Caller',pd.DatetimeIndex(df['Date']).normalize()])['Called'].nunique().groupby(level=0).max().reset_index(name='MaxCallsOneDay')
100 loops, best of 3: 3.52 ms per loop

关于python - Pandas Efficient Count 列中的唯一值然后找到该计数的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35723759/

相关文章:

Python 中的 Java Fluent Wait

python - 重复的 Json 字符串打印

python-3.x - 线性回归中与一个特征的每次交互都会增加梯度下降成本

python - 如何将 pandas 数据框转换为 .tde?

python - 过滤列表列的列表,然后在 Python 中逐行拆分(分解)

python - 在 linux 上用 python 从 postfix 读取邮件

python - 初始化高维稀疏矩阵

python - Pandas 行函数行迭代

python - 将特定索引转换为自己的行

python - 使用 pandas 删除数据框中的特定行