#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-й метод такой быстрый. Я буду использовать этот метод