Выводите строку столько раз, сколько ее значение плюс единица появляется в других строках

#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, после слияния нам просто нужно вычесть единицу, вернуться к оригиналу