我有一个这样的数据框:
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后,它将不起作用,我不知道为什么要这样做以及如何解决>
答案 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
更好