【问题标题】:How to get count of column values for each unique pair of columns in pandas?如何获取熊猫中每对唯一列的列值计数?
【发布时间】:2020-12-22 19:52:01
【问题描述】:

我有下面给出的数据

data = [(datetime.datetime(2020, 12, 21, 6, 50, 14, 955551), 'blr', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 6, 0, 242578), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 16, 30, 260692), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 18, 15, 333229), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 29, 0, 839566), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 37, 45, 211979), 'lon', 'del', 'low'), (datetime.datetime(2020, 12, 21, 7, 41, 15, 211376), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 48, 16, 26287), 'lon', 'del', 'low'), (datetime.datetime(2020, 12, 21, 7, 55, 17, 248074), 'ny', 'del', 'low'), (datetime.datetime(2020, 12, 21, 7, 57, 2, 55666), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 8, 4, 2, 319699), 'lon', 'del', 'low'), (datetime.datetime(2020, 12, 21, 8, 25, 5, 982621), 'ny', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 8, 26, 50, 997280), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 8, 39, 7, 14287), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 8, 47, 51, 810956), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 9, 37, 23, 99922), 'ny', 'del', 'low')]

这就是我在 pandas 中加载它的方式

import pandas as pd
import datetime

df = pd.DataFrame(data)
df.columns = ["date", "start", "end", "type"]
df.set_index('date', inplace=True)

现在我可以通过执行类似的操作来获取所有具有特定类型的行,例如 medium

print(df[df.values == 'medium'])

现在我想知道startend 的每一对唯一对,medium 类型的计数是多少?基本上我想要类似的东西

blr del 1
lon del 9
ny  del 1

但我不知道我怎样才能得到它。如何做到这一点?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用GroupBy.size 指定列进行测试:

    s1 = df[df.values == 'medium'].groupby(['start','end']).size()
    print (s1)
    start  end
    blr    del    1
    lon    del    9
    ny     del    1
    dtype: int64
    

    或者如果还想要type的所有组合:

    print(df.groupby(['type','start','end']).size())
    type    start  end
    low     lon    del    3
            ny     del    2
    medium  blr    del    1
            lon    del    9
            ny     del    1
    dtype: int64
    
    
    print (s.loc['medium'])
    start  end
    blr    del    1
    lon    del    9
    ny     del    1
    dtype: int64
    
    
    print (s.loc['low'])
    start  end
    lon    del    3
    ny     del    2
    dtype: int64
    

    【讨论】:

    • 谢谢!这就是我一直在寻找的。​​span>
    【解决方案2】:

    使用value_counts:

    res = df[df['type'].eq('medium')].value_counts()
    print(res)
    

    输出

    start  end  type  
    lon    del  medium    9
    ny     del  medium    1
    blr    del  medium    1
    dtype: int64
    

    来自文档:

    返回包含 DataFrame 中唯一行数的 Series。

    如果您想从输出中删除类型,请按照@jezrael 的建议使用 droplevel:

    res = df[df['type'].eq('medium')].value_counts().droplevel(level=-1)
    print(res)
    

    输出

    start  end
    lon    del    9
    ny     del    1
    blr    del    1
    dtype: int64
    

    这也可以扩展到所有类型,例如,使用:

    res = df.value_counts(subset=['type', 'start', 'end']).sort_index(level=0)
    print(res)
    

    输出

    type    start  end
    low     lon    del    3
            ny     del    2
    medium  blr    del    1
            lon    del    9
            ny     del    1
    dtype: int64
    

    【讨论】:

    • res = df[df['type'].eq('medium')].value_counts().droplevel(-1)
    • 使用df['type'].eq('medium') 代替df['type']=='medium' 对我来说更容易阅读有什么好处吗?
    • @MrT 在这种特殊情况下,我认为没有任何优势,虽然我发现使用 eq 更具可读性,但是当您必须组合多个条件时,这可以节省括号的使用。
    • @SouvikRay 很高兴我能帮上忙!
    【解决方案3】:
    df.where(lambda x:x.type == "medium").dropna().groupby(['start', 'end']).type.agg("count")
    
    start  end
    blr    del    1
    lon    del    9
    ny     del    1
    Name: type, dtype: int64
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2017-05-30
    • 2021-08-03
    • 2018-06-10
    • 2021-03-17
    相关资源
    最近更新 更多