Tengo datos como

ID,"url","used_at","active_seconds"
d684cd5f0189ab49c391c2b7bcbac0cb,"vk.com/videos168693045?section=all",2016-03-01 10:18:45,4
d684cd5f0189ab49c391c2b7bcbac0cb,"vk.com",2016-03-01 10:18:49,2
d684cd5f0189ab49c391c2b7bcbac0cb,"vk.com/feed",2016-03-01 10:18:51,2
d684cd5f0189ab49c391c2b7bcbac0cb,"vk.com/audios291781172",2016-03-01 10:18:53,2
d684cd5f0189ab49c391c2b7bcbac0cb,"vk.com/audios291781172?q=Тимур%20Гатиятуллин%20%7C%20Честный%20-%20Улетай%20полная%20версия",2016-03-01 10:18:55,6
d684cd5f0189ab49c391c2b7bcbac0cb,"vk.com/audios291781172?q=Тимур%20ГатиятуллинЧестный%20-%20Улетай%20полная%20версия",2016-03-01 10:19:01,2
d684cd5f0189ab49c391c2b7bcbac0cb,"vk.com/audios291781172?q=Тимур%20Гатиятуллин%20Честный%20-%20Улетай%20полная%20версия",2016-03-01 10:19:03,4
d684cd5f0189ab49c391c2b7bcbac0cb,"vk.com/audios168693045?section=all",2016-03-01 10:19:07,2

Necesito contar id en la URL que incluye audios. Salida de deseo:

d684cd5f0189ab49c391c2b7bcbac0cb: 291781172 - 4, 168693045 - 1, etc

No sé cómo puedo obtener id después de audio y contar eso.

data = pd.read_csv("get_id.csv")
data_name = pd.read_excel("name.xlsx")
names_panel = data_name['Names']
urls = data['url']
ids = data['ID']
for url in urls:
    if 'audios' in url:
        print url
2
user6230169 11 may. 2016 a las 11:44

3 respuestas

La mejor respuesta
print pd.concat([df['ID'], df['url'].str.extract('(?P<count>audios)(?P<digit>\d+)')], axis=1).groupby(['ID', 'digit']).count()

                                            count
ID                               digit           
d684cd5f0189ab49c391c2b7bcbac0cb 168693045      1
                                 291781172      4
1
su79eu7k 11 may. 2016 a las 09:15

Aquí hay una forma no pitónica de hacerlo (usando bucles).

Primero IIUC, los números que intenta obtener siempre tienen la misma longitud, ¿estoy en lo cierto? luego haga una lista de su url, seleccione lo que desea y cree una cadena de nuevo.

ids = df.ID.unique()
for identity in ids:
    my_list = []
    for url in urls:
        if 'audios' in url:
            my_list.append(''.join(list(url)[13:22]))
    for number in set(my_list):
        print(str(identity) + ': ' +number +': '+ str(my_list.count(number)))
0
ysearka 11 may. 2016 a las 09:08

Creo que necesita str.extract. Entonces groupby por { {X2}} y nueva columna no con size:

df[['no']] = df.url.str.extract(r'audios(\d+)?', expand=False)
print df

print df.groupby(['ID', 'no']).size().reset_index(name='count')
                                 ID         no  count
0  d684cd5f0189ab49c391c2b7bcbac0cb  168693045      1
1  d684cd5f0189ab49c391c2b7bcbac0cb  291781172      4

O sin crear una nueva columna:

print df.groupby([df.ID, df.url.str.extract(r'audios(\d+)?', expand=False)])
        .size().reset_index(name='count')
                                 ID        url  count
0  d684cd5f0189ab49c391c2b7bcbac0cb  168693045      1
1  d684cd5f0189ab49c391c2b7bcbac0cb  291781172      4

Yo mejoro su79eu7k respuesta (agregue as_index=False para la devolución DataFrame y elimine la advertencia agregando {{ X2}}) y luego compara las soluciones:

Tiempo :

In [152]: %timeit pd.concat([df['ID'], df['url'].str.extract('(?P<count>audios)(?P<digit>\d+)', expand=False)], axis=1).groupby(['ID', 'digit'], as_index=False).count()
100 loops, best of 3: 3.5 ms per loop

In [153]: %timeit df.groupby([df.ID, df.url.str.extract(r'audios(\d+)?', expand=False)]).size().reset_index(name='count')
1000 loops, best of 3: 1.92 ms per loop
1
Community 23 may. 2017 a las 10:29