#python #pandas #loops #dataframe #rows
#питон #панды #петли #фрейм данных #строки
Вопрос:
Я хочу напечатать каждую строку в новом df (df2) в зависимости от того, сколько раз появляется его imageno 1. Итак, в приведенных ниже данных строка 1 должна быть напечатана дважды (есть две 7), строка 2 дважды, строка 3 дважды, строка 4 один раз (есть одна 8), строка 5 один раз и т.д.
import pandas as pd
print(df)
x-position y-position imageno
1 220 220 6
2 627 220 6
3 620 220 6
4 220 220 7
5 628 220 7
6 621 220 8
df2 = pd.DataFrame(columns=['x-position', 'y-position', 'imageno'])
Ответ №1:
IIUC, создайте вспомогательный ряд, используя Series.value_counts
, затем используйте Series.map
, index.repeat
и DataFrame.loc
чтобы получить желаемое количество или повторений:
df = pd.DataFrame({'x-position': {1: 220, 2: 627, 3: 620, 4: 220, 5: 628, 6: 621}, 'y-position': {1: 220, 2: 220, 3: 220, 4: 220, 5: 220, 6: 220}, 'imageno': {1: 6, 2: 6, 3: 6, 4: 7, 5: 7, 6: 8}})
s = df['imageno'].value_counts()
df2 = df.loc[df.index.repeat(df['imageno'].add(1).map(s).fillna(0).astype(int))]
[out]
x-position y-position imageno
1 220 220 6
1 220 220 6
2 627 220 6
2 627 220 6
3 620 220 6
3 620 220 6
4 220 220 7
5 628 220 7
Комментарии:
1. Спасибо. Я получил сообщение об ошибке
SyntaxError: unexpected EOF while parsing
. Вы знаете, как я мог бы это исправить, пожалуйста?2. @sforbes хммм, получаете ли вы EOF, если копируете и вставляете приведенный выше код, включая образцы данных ..? Может быть, у вас где-то отсутствует закрывающая скобка или закрывающие кавычки?
3. Дает ли сообщение об ошибке подсказку о том, где в коде находится ошибка SyntaxError? Какая строка, какой столбец и т.д.?
4. Спасибо за образец данных. С помощью кода, который вы отправили, я получаю сообщение об ошибке
TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'
5. Я не могу воспроизвести эту ошибку, может быть, проблема с управлением версиями ..? Я обновил код, добавив
astype(int)
метод in. Не могли бы вы попробовать еще раз?
Ответ №2:
IIUC merge
после настройки 'imageno'
df.assign(imageno=df.imageno 1).merge(df[['imageno']],on='imageno').assign(imageno=lambda x : x['imageno']-1)
Out[894]:
x-position y-position imageno
0 220 220 6
1 220 220 6
2 627 220 6
3 627 220 6
4 620 220 6
5 620 220 6
6 220 220 7
7 628 220 7
Комментарии:
1. Спасибо. Это работает (сообщений об ошибках нет), но я думаю, что изображения на единицу выше, чем они должны быть?
2. Это сработало, спасибо. Можно ли объяснить код, пожалуйста?
3. @sforbes добавьте единицу, поэтому, когда слияние (6 1) объединится с 7, после слияния нам просто нужно вычесть единицу, вернуться к оригиналу