分组依据和熊猫数据框上的字符串串联后的“ Nan”

时间:2020-01-13 23:57:51

标签: python pandas dataframe pandas-groupby

我有一个这样的数据框:

name  | weekday | count 
Peter | Friday  | {16, 17, 9, 10, 15}
Peter | Friday  | {10, 11, 14}  
Peter | Friday  | {16, 17, 11, 12, 15}  
Bob   | Friday  | {10}
Bob   | Friday  | {9, 10, 11, 12, 13}
Bob   | Friday  | {9, 10, 11, 14, 15}

我想按名称和工作日分组,像这样添加count的交集新列:

name  | weekday | intersection 
Peter | Friday  | 
Bob   | Friday  | 10

在没有交集的情况下应该返回空字符串的地方,这是我使用的代码:

df.groupby(['name','weekday']).apply(lambda x: pd.Series({'intersection': ", ".join("{0}".format(n) for n in sorted(list(set.intersection(*x['count']))))})).reset_index()

但是我得到这样的结果:

name  | weekday | intersection 
Peter | Friday  | Nan
Bob   | Friday  | 10

我在空列表上尝试过''.join(),它可以正常工作并返回空字符串,但是在使用group by后,它将不起作用,我不知道为什么要这样做以及如何解决

1 个答案:

答案 0 :(得分:0)

通过reduce查找交叉点,“字符串化”并加入:

from functools import reduce

def get_intersection(s: pd.Series) -> str:
    intersect = reduce(lambda a, b: a.intersection(b), s.iloc[1:], s.iat[0])
    return ', '.join([str(x) for x in intersect])

intersection = (df.groupby(['name', 'weekday'])['count']
                  .agg(get_intersection)
                  .rename('intersection')
                  .reset_index()
                 )

为您提供:

print(intersection)

    name    weekday intersection
0   Bob     Friday  10
1   Peter   Friday  

如果要处理重叠很少的大型数据集,则为避免不必要的处理/工作,while len(intersect) > 0循环可能比reduce更好