如果有人能帮我,我真的很感激:
我有这个数据帧,它包含电话号码("called_to"(,以及该号码是否位于呼叫或不呼叫列表列:("dispo"(。每一行都是一个单独的调用,ok to调用用"c"指定,do not调用用"d"指定。
这些调用是按时间顺序进行的,因此索引可以作为一种日期时间指示器。
我想做的是只打印一个号码放在禁止呼叫列表上,然后有一个可以呼叫的指定的号码。所有这些号码都有多个呼叫,但总共可以有2到n个呼叫。
我不明白的是如何使用groupby,然后对符合标准的数字进行排序。我在想,也许我可以试着看看这个组是否按字母顺序失败(c,c,d,c会失败,而c,c、d会通过(。再次,不确定如何在groupby中做到这一点,我正在尝试看看我是否可以使用.apply.
创建示例数据帧
edf = pd.DataFrame.from_dict({'called_to' : ['11' , '22' , '33', '44', '11' , '22' , '33', '44','11' , '22' , '33', '44','11' , '22' , '33', '44'], 'dispo': ['c' , 'c', 'd', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'd', 'c', 'd', 'c', 'c']})
edf
called_to dispo
0 11 c
1 22 c
2 33 d
3 44 c
4 11 c
5 22 c
6 33 c
7 44 c
8 11 c
9 22 c
10 33 c
11 44 d
12 11 c
13 22 d
14 33 c
15 44 c
我可以使用groupby显示信息,它看起来像这样:
by_number = edf.groupby('called_to')
for key, item in by_number:
print(by_number.get_group(key), "nn")
called_to dispo
0 11 c
4 11 c
8 11 c
12 11 c
called_to dispo
1 22 c
5 22 c
9 22 c
13 22 d
called_to dispo
2 33 d
6 33 c
10 33 c
14 33 c
called_to dispo
3 44 c
7 44 c
11 44 d
15 44 c
所需输出为:
called_to dispo
2 33 d
6 33 c
10 33 c
14 33 c
called_to dispo
3 44 c
7 44 c
11 44 d
15 44 c
您可以使用过滤组
# is the call OK?
m1 = edf['dispo'].eq('c')
# was a previous call not OK?
m2 = edf.groupby('called_to')['dispo'].shift(-1).eq('d')
edf[(m1&m2).groupby(edf['called_to']). transform('any')]
循环中使用的变体
by_number = edf.groupby('called_to')
m1 = edf['dispo'].eq('c')
m2 = by_number['dispo'].shift().eq('d')
m = m1&m2
keep = set(edf.loc[m, 'called_to'])
for key, item in by_number:
if key in keep:
print(by_number.get_group(key), "nn")
输出:
called_to dispo
2 33 d
6 33 c
10 33 c
14 33 c
called_to dispo
3 44 c
7 44 c
11 44 d
15 44 c