python - 缺少 key 的 Pandas groupby

标签 python pandas

假设我有以下地址和电话号码数据框:

>>> import pandas as pd
>>> df=pd.DataFrame()
>>> df['Address']=['1 Main St','1 Main St','45 Spruce St','45 Spruce St','100 Green St','100 Green St', '500 Washington','500 Washington']
>>> df['Phone']=['555-5555','555-5555','666-6666','666-6667','777-7777',None,None,None]
>>> df
          Address     Phone
0       1 Main St  555-5555
1       1 Main St  555-5555
2    45 Spruce St  666-6666
3    45 Spruce St  666-6667
4    100 Green St  777-7777
5    100 Green St      None
6  500 Washington      None
7  500 Washington      None
>>> 

我想对 Address 和 Phone 字段进行分组,并计算每组中的地址数。但是,我有一个额外的标准:具有相同地址但缺少(不是不同的)电话号码的组应被视为具有相同的地址和电话号码。在我下面的示例中,这意味着最后一条记录也应假定为具有电话号码 777-7777。此外,具有相同地址但都没有电话号码的组也应分组(在我的示例中为华盛顿)。

当我按地址和电话分组时,没有值被丢弃:

>>> df.groupby(['Address','Phone']).size().reset_index().rename(columns={0:'Size'})
        Address     Phone  Size
0     1 Main St  555-5555     2
1  100 Green St  777-7777     1
2  45 Spruce St  666-6666     1
3  45 Spruce St  666-6667     1
>>> 

基本上,本地址组中的所有记录都有电话号码时,我希望按地址和电话分组,而当电话值缺失时,我只按地址分组。我想要的输出是:

          Address     Phone
0       1 Main St  555-5555
1    45 Spruce St  666-6666
2    45 Spruce St  666-6667
3    100 Green St  777-7777
4  500 Washington      None
>>> 

关于我如何做到这一点有什么建议吗?

最佳答案

好问题。

以下情况如何:

def count_phones(g):
    distinct = len(g.dropna().unique())
    return distinct if distinct else 1

>>> df.Phone.groupby(df.Address).agg(count_phones)
Address
1 Main St         1
100 Green St      1
45 Spruce St      2
500 Washington    1
dtype: int64
  • 仅按地址分组。

  • 在每个组中,计算电话号码的非空唯一值。

  • 如果数字是 0,则所有都是 None,我们返回 1。

关于python - 缺少 key 的 Pandas groupby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35092247/

相关文章:

python减去多个小数位

python - 根据条件重命名 Pandas 数据框的多列

python - .order_by() 没有按应有的方式/我期望的方式工作

python - 如何在 Python 中获取全局变量?

python - 计算 pandas DataFrame 中的所有 NaN

python - 在 python pandas 中将多个年份列转换为单个年份列(整洁格式)

python - Pandas 如何在数据框列中提取整数和 float 的混合

python - 如何定期使用opencv python更新图像的绘图窗口?

python - 从 pandas Dataframe 字符串的科学记数号中获取幂数

python - 如何从 Pandas 数据框中的一行中选择具有最高值的 3 列?