Установите индекс для группы повторяющихся значений строк в файле csv с помощью Python

Я новичок в питоне. Я хочу установить индекс для определенного набора элементов строки, которые повторяются для каждой группы. Мой фрейм данных:

Установите индекс для группы повторяющихся значений строк в файле csv с помощью Python

data_dict  = {'0_deg': [2, 11, 21, -17, 5, 40, 22, 7, 20, -6, -6, -6, 24, 21, 20, 61, 21, 5, 2, 17], 
 '10_deg': [12, -21, 11, 1, 4, -2, 33, 53, 18, 10, -3, -1, 23, 18, 23, 8, 11, -25, 21, -14], 
 '20_deg': [23, -10, 3, 20, -41, 13, 10, 5, -9, 7, -4, -21, 14, -26, -31, 9, 1, -15, 3, -6], 
 '30_deg': [12, 9, -5, 4, 9, -46, 1, -8, -27, 3, -9, -14, 15, -6, 14, 7, -11, 5, 19, -4]}
data_dict = pd.read_csv('Dataset.csv')
data_dict = data_dict.set_index('Indexes')

#row idx of a group in this list
idx =[4,10,37,109,133]

Здесь список создается как IDX, а значения индекса записываются вручную.

Но для большей матрицы из 1000+ индексов (случайных значений) на группу это будет очень сложной задачей.

Я хочу, чтобы при чтении файла CSV было выбрано 1-е значение в строке, и до тех пор, пока одно и то же значение не появится в том же индексе, его следует рассматривать как 1 группу, а индексы для 1-й группы должны быть сохранены в IDX

Например: в моей небольшой версии набора данных из 1-го столбца Indexes 1-е значения, т.е. 4,10,37,109,133, являются моими индексами для 1-й группы. Эти значения повторяются в той же последовательности для следующих групп. Только их нельзя вводить вручную в коде. Группу следует рассматривать до тех пор, пока не произойдет следующее 4. Таким образом, значения индекса от 4 до 133 должны рассматриваться как 1 группа в IDX. Это потому, что мне нужен IDX для дальнейшей части кода.

Мой фактический набор данных имеет более 1000 значений индекса на группу. Таким образом, IDX должен автоматически принимать все значения группы.

# getting some dimensions and sorting the data
row_idx_length = len(idx) 
group_length = len(data_dict['0_deg'])
number_of_groups = len(data_dict.keys())  
idx = idx*number_of_groups   
data_arr = np.zeros((group_length,number_of_groups),dtype=np.int32) 

Возможно ли, что в последней группе отсутствуют некоторые значения из повторяющегося индекса?

jezrael 30.05.2019 08:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
202
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я считаю, что вам нужно numpy.tile с целочисленным делением на количество повторений:

df.index = np.tile(idx, len(df.index) // len(idx))

Но если получить ошибку (N и M — некоторые целые числа):

ValueError: Length mismatch: Expected axis has N elements, new values have M elements

Это означает, что в последней группе отсутствуют некоторые элементы, поэтому добавьте следующую группу по 1 и отфильтруйте по длине index of DataFrame:

#added 150 to idx list
idx =[4,10,37,109,133,150]
df.index = np.tile(idx, len(df.index) // len(idx) + 1)[:len(df.index)]
print (df)          
     0_deg  10_deg  20_deg  30_deg
4        2      12      23      12
10      11     -21     -10       9
37      21      11       3      -5
109    -17       1      20       4
133      5       4     -41       9
150     40      -2      13     -46
4       22      33      10       1
10       7      53       5      -8
37      20      18      -9     -27
109     -6      10       7       3
133     -6      -3      -4      -9
150     -6      -1     -21     -14
4       24      23      14      15
10      21      18     -26      -6
37      20      23     -31      14
109     61       8       9       7
133     21      11       1     -11
150      5     -25     -15       5
4        2      21       3      19
10      17     -14      -6      -4

В группе более 1000 элементов. Итак, как я могу установить их динамически для IDX? Я не хочу вручную создавать список вроде idx=[4,10,37,109,133,150]

axay 30.05.2019 08:25

@anky_91 - хм, сложный вопрос, но если много элементов, то numpy должен работать быстрее.

jezrael 30.05.2019 08:26

@АкшайК. - Как счет idx ?

jezrael 30.05.2019 08:26

В одном из моих фреймов данных индекс начинается со значения 4, как показано. В другом он может начинаться с какого-то другого значения. Но каким бы ни было значение, оно будет повторяться для каждой из групп, также фиксирован диапазон показателей для каждой группы. Например. от 4 до ```133`` элементы фиксируются.

axay 30.05.2019 08:32

@АкшайК. - Не уверен, что понял, есть много других фреймов данных для разбора значения для idx? Можете ли вы создать минимальный, полный и проверяемый пример, если это возможно, в новом вопросе?

jezrael 30.05.2019 08:35

@АкшайК. - Или какова логика для начального номера в другом DataFrame?

jezrael 30.05.2019 08:36

Возможно ли, чтобы idx динамически сохранял значение индекса одной группы. Например: если я возьму 1-е значение индекса в качестве входных данных, то есть 4, то до тех пор, пока в 4 не произойдет следующее появление Indexes, мой IDX должен хранить все промежуточные значения в качестве индекса.

axay 30.05.2019 08:36

Давайте продолжить обсуждение в чате.

jezrael 30.05.2019 08:40
Ответ принят как подходящий

Если я правильно понимаю ваш вопрос, вам нужно получить idx с учетом фрейма данных с такой настройкой индекса.

data_dict  = {'0_deg': [2, 11, 21, -17, 5, 40, 22, 7, 20, -6, -6, -6, 24, 21, 20, 61, 21, 5, 2, 17], 
 '10_deg': [12, -21, 11, 1, 4, -2, 33, 53, 18, 10, -3, -1, 23, 18, 23, 8, 11, -25, 21, -14], 
 '20_deg': [23, -10, 3, 20, -41, 13, 10, 5, -9, 7, -4, -21, 14, -26, -31, 9, 1, -15, 3, -6], 
 '30_deg': [12, 9, -5, 4, 9, -46, 1, -8, -27, 3, -9, -14, 15, -6, 14, 7, -11, 5, 19, -4]}
import pandas as pd
df = pd.DataFrame(data_dict)

idx =[4,10,37,109,133]
df.index = idx * (len(df)//len(idx))

print(df)
#Output:
     0_deg  10_deg  20_deg  30_deg  groups
4        2      12      23      12       1
10      11     -21     -10       9       1
37      21      11       3      -5       1
109    -17       1      20       4       1
133      5       4     -41       9       1
4       40      -2      13     -46       2
10      22      33      10       1       2
37       7      53       5      -8       2
109     20      18      -9     -27       2
133     -6      10       7       3       2
4       -6      -3      -4      -9       3
10      -6      -1     -21     -14       3
37      24      23      14      15       3
109     21      18     -26      -6       3
133     20      23     -31      14       3
4       61       8       9       7       4
10      21      11       1     -11       4
37       5     -25     -15       5       4
109      2      21       3      19       4
133     17     -14      -6      -4       4

После завершения настройки вам просто нужно рассчитать, где повторяется 0-е значение. Вы можете просто вычислить его напрямую, но, возможно, также полезнее сделать дополнительный столбец для дальнейших вычислений.

temp = df.index == df.index[0]
groups = temp.cumsum()
idx_out = list(df.index[groups == 1])

print(idx_out) #[4, 10, 37, 109, 133]

#Optional:

df['groups'] = groups #can be very useful for aggregations and groupby calculations

В вашем коде вы создали список для индекса idx=[4,10,37,109,133]. Возможно ли, вместо того, чтобы вводить все значения, следует вводить только первое значение, например. 4 , так что IDX будет хранить значения 1-го столбца, начиная с 4, до следующего 4 в этом столбце?

axay 30.05.2019 10:41

Можете ли вы уточнить, что «idx будет хранить значения 1-го столбца, начиная с 4, до тех пор, пока в этом столбце не появятся следующие 4»? У меня сложилось впечатление, что вы уже «получали» такие индексы, а мой начальный idx был только частью «настройки». Разве вы уже не получаете индекс с каким-то повторением?

Paritosh Singh 30.05.2019 10:43

Если вы просто используете 2-ю часть ответа, предполагая, что вы получаете фрейм данных с таким набором индексов, он даст вам все, что idx_out для этого фрейма данных.

Paritosh Singh 30.05.2019 10:44

Я получаю повторение с одинаковыми интервалами, но это только случай для 5 значений индекса, мой исходный набор данных имеет 5000 значений, поэтому 4 будет повторяться после 5000 нечетных значений. Итак, как указать idx=[] для такого случая?

axay 30.05.2019 10:46

и код здесь будет работать и для 5000 значений, если ваше условие, что «первое значение не повторяется, пока не повторится вся группа», истинно. Попробуйте.

Paritosh Singh 30.05.2019 10:48

Является ли ваш текущий вопрос хорошим представлением того, что вам нужно? Я правильно вас понял или нет? @АкшайК.

Paritosh Singh 30.05.2019 10:49

Да. Я получаю точный результат, как и ожидалось. Спасибо за поддержку.

axay 30.05.2019 11:45

Другие вопросы по теме