Код Pandas для получения количества каждого значения

#python #python-3.x #pandas #dataframe #count

#python #python-3.x #pandas #фрейм данных #количество

Вопрос:

Здесь я делюсь образцом данных (я имею дело с большими данными), значение «counts» варьируется от 1 до 3000 , иногда и больше..

Пример данных выглядит следующим образом :

           ID                                            counts
41 44 17 16 19 52                                          6

17 30 16 19                                                4

52 41 44 30 17 16                                          6

41 44 52 41 41 41                                          6 

17 17 17 17 41                                             5
 

Я пытался разделить столбец «ID» на несколько и пытался получить это количество,,

   data= reading the csv_file
 split_data = data.ID.apply(lambda x: pd.Series(str(x).split(" "))) # separating columns
 

как я уже упоминал, я имею дело с большими данными,, поэтому этот метод не так эффективен .. я сталкиваюсь с проблемой получения количества «ID»

Я хочу собрать общее количество каждого идентификатора и сопоставить его с соответствующим столбцом идентификатора.

Ожидаемый результат:

           ID                  counts   16     17     19     30     41     44     52   
41 41 17 16 19 52               6       1     1      1      0      2       0     1

17 30 16 19                     4       1     1      1      1      0       0     0  

52 41 44 30 17 16               6       1     1      0      1      1       1     1

41 44 52 41 41 41               6       0     0      0      0      4       1     1

17 17 17 17 41                  5       0     4      0      0      1       0     0
 

Если у вас есть какие-либо идеи,, пожалуйста, дайте мне знать

Спасибо

Ответ №1:

Используйте Counter для получения количества значений, разделенных пробелом, в понимании списка:

 from collections import Counter

L = [{int(k): v for k, v in Counter(x.split()).items()} for x in df['ID']]
df1 = pd.DataFrame(L, index=df.index).fillna(0).astype(int).sort_index(axis=1)
df = df.join(df1)
print (df)
                  ID  counts  16  17  19  30  41  44  52
0  41 44 17 16 19 52       6   1   1   1   0   1   1   1
1        17 30 16 19       4   1   1   1   1   0   0   0
2  52 41 44 30 17 16       6   1   1   0   1   1   1   1
3  41 44 52 41 41 41       6   0   0   0   0   4   1   1
4     17 17 17 17 41       5   0   4   0   0   1   0   0
 

Еще одна идея, но, я думаю, медленнее:

 df1 = df.assign(a = df['ID'].str.split()).explode('a')
df1 = df.join(pd.crosstab(df1['ID'], df1['a']), on='ID')
print (df1)
                  ID  counts  16  17  19  30  41  44  52
0  41 44 17 16 19 52       6   1   1   1   0   1   1   1
1        17 30 16 19       4   1   1   1   1   0   0   0
2  52 41 44 30 17 16       6   1   1   0   1   1   1   1
3  41 44 52 41 41 41       6   0   0   0   0   4   1   1
4     17 17 17 17 41       5   0   4   0   0   1   0   0
 

Комментарии:

1. спасибо, приятель, 1-й метод такой быстрый. Я буду использовать этот метод