Я новичок в питоне. Я хочу установить индекс для определенного набора элементов строки, которые повторяются для каждой группы. Мой фрейм данных:
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)
Я считаю, что вам нужно 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]
@anky_91 - хм, сложный вопрос, но если много элементов, то numpy должен работать быстрее.
@АкшайК. - Как счет idx
?
В одном из моих фреймов данных индекс начинается со значения 4
, как показано. В другом он может начинаться с какого-то другого значения. Но каким бы ни было значение, оно будет повторяться для каждой из групп, также фиксирован диапазон показателей для каждой группы. Например. от 4
до ```133`` элементы фиксируются.
@АкшайК. - Не уверен, что понял, есть много других фреймов данных для разбора значения для idx
? Можете ли вы создать минимальный, полный и проверяемый пример, если это возможно, в новом вопросе?
@АкшайК. - Или какова логика для начального номера в другом DataFrame?
Возможно ли, чтобы idx динамически сохранял значение индекса одной группы. Например: если я возьму 1-е значение индекса в качестве входных данных, то есть 4
, то до тех пор, пока в 4
не произойдет следующее появление Indexes
, мой IDX должен хранить все промежуточные значения в качестве индекса.
Давайте продолжить обсуждение в чате.
Если я правильно понимаю ваш вопрос, вам нужно получить 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 в этом столбце?
Можете ли вы уточнить, что «idx будет хранить значения 1-го столбца, начиная с 4, до тех пор, пока в этом столбце не появятся следующие 4»? У меня сложилось впечатление, что вы уже «получали» такие индексы, а мой начальный idx
был только частью «настройки». Разве вы уже не получаете индекс с каким-то повторением?
Если вы просто используете 2-ю часть ответа, предполагая, что вы получаете фрейм данных с таким набором индексов, он даст вам все, что idx_out
для этого фрейма данных.
Я получаю повторение с одинаковыми интервалами, но это только случай для 5 значений индекса, мой исходный набор данных имеет 5000 значений, поэтому 4 будет повторяться после 5000 нечетных значений. Итак, как указать idx=[]
для такого случая?
и код здесь будет работать и для 5000 значений, если ваше условие, что «первое значение не повторяется, пока не повторится вся группа», истинно. Попробуйте.
Является ли ваш текущий вопрос хорошим представлением того, что вам нужно? Я правильно вас понял или нет? @АкшайК.
Да. Я получаю точный результат, как и ожидалось. Спасибо за поддержку.
Возможно ли, что в последней группе отсутствуют некоторые значения из повторяющегося индекса?