Pandas groupby缺少密钥

时间:2016-01-29 19:11:07

标签: 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
>>> 

我想通过地址和电话字段进行分组,并获取每个组中的地址数。但是,我有一个附加条件:具有相同地址但缺少(不同)电话号码的组应被视为具有相同的地址和电话号码。在下面的示例中,这意味着应该假设最后一条记录的电话号码为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
>>> 

关于我如何做到这一点的任何建议?

1 个答案:

答案 0 :(得分:1)

好问题。

以下内容如何:

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.