расширение строки по столбцу при манипулировании другой строкой в ​​зависимости от значения - PullRequest
2 голосов
/ 12 июля 2019

У меня есть DataFrame, например:

  column1  column2  column3
0       a        2        2
1       b        1        0
2       c        3        2

Где значение в column3 обязательно <= значение в column2 </p>

Я хочу расширить df до уровня ниже, основываясь на следующих правилах:

  column1  column2  column3
0       a        1        1
1       a        1        1
2       b        1        0
3       c        1        1
4       c        1        1
5       c        1        0
  1. каждая строка раскрывается в число строк, равное ее значению в column2
  2. значение column3 для расширенных строк равно 1, если ее индекс (относительнок его столбцу column1) меньше, чем значение исходной нерасширенной строки в column3.

Например: посмотрите, что строка с column1 = a была расширена до 2 строк, поскольку ее значение column2 было равно 2,и обе результирующие строки раскрытия имеют значение 1 в column3, потому что 0 <2 и 1 <2. </p>

Обратите внимание, что строка с column1 = c была расширена на 3 строки, потому что ее значение column2 было равно 3,однако, только первые 2 результирующих строки раскрытия имеют значение 1 в column3 (опять же: 0 <2 и 1 <2), однако, третья развернутая строка получает значение 0 для column3, потому что (да, да, да, этоне математика для детского сада) не верно, что 2 <2. </p>

Какую функцию я могу использовать на кадре данных, таком как первый, для получения результата, похожего на второй?

Ответы [ 2 ]

2 голосов
/ 12 июля 2019

np.repeat + cumcount

u = pd.DataFrame(np.repeat(df.values, df.column2, axis=0), columns=df.columns)

u.assign(
  column2=1,
  column3=(u.column3 > u.groupby('column1').cumcount()).astype(int)
)

  column1  column2  column3
0       a        1        1
1       a        1        1
2       b        1        0
3       c        1        1
4       c        1        1
5       c        1        0
1 голос
/ 12 июля 2019

Что я думаю, это проблема слияния

s1=df.loc[df.index.repeat(df.column2),['column1']].assign(column2=1).reset_index(drop=True)
s2=df.loc[df.index.repeat(df.column3),['column1']].assign(column3=1).reset_index(drop=True)
df=s1.assign(Key=s1.groupby(s1.column1).cumcount()).merge(s2.assign(Key=s2.groupby(s2.column1).cumcount()),how='left').fillna(0)
df

  column1  column2  Key  column3
0       a        1    0      1.0
1       a        1    1      1.0
2       b        1    0      0.0
3       c        1    0      1.0
4       c        1    1      1.0
5       c        1    2      0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...