说我有以下地址和电话号码的数据框:
>>> 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
>>>
关于我如何做到这一点的任何建议?
答案 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.