Повторение строк в DataFrame на основе столбца - PullRequest
0 голосов
/ 25 мая 2018

У меня есть кадр данных:

   class1  class2  value  value2
0       1       0      1       4
1       2       1      2       3
2       2       0      3       5
3       3       1      4       6

Я хочу повторить строки и вставить столбец приращения в том же количестве в соответствии с разницей между value и value2.Я хочу, чтобы датафрейм должен был выглядеть так:

    class1  class2  value  value2  value3
0        1       0      1       4       1
1        1       0      1       4       2
2        1       0      1       4       3
3        1       0      1       4       4
4        2       1      2       3       2
5        2       1      2       3       3
6        2       0      3       5       3
7        2       0      3       5       4
8        2       0      3       5       5
9        3       1      4       6       4
10       3       1      4       6       5
11       3       1      4       6       6

Я пробовал так:

def func(x):
    copy = x.copy()
    num = x.value2+1-x.value
    return pd.concat([copy]*num.values[0])
df= df.groupby(['class1','class2']).apply(lambda x:func(x))

Но возникнет проблема oredr, из-за которой я не знаю, как добавить столбецvalue3.И я хотел бы иметь элегантный способ сделать это.

Кто-нибудь может мне помочь?Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вот последовательность вещей, которая даст вам желаемый результат:

df.join(df
        .apply(lambda x: pd.Series(range(x.value, x.value2+1)), axis=1)
        .stack().astype(int)
        .reset_index(level=1, drop=1)
        .to_frame('value3')).reset_index(drop=1)

Out[]:
    class1  class2  value  value2  value3
0        1       0      1       4       1
1        1       0      1       4       2
2        1       0      1       4       3
3        1       0      1       4       4
4        2       1      2       3       2
5        2       1      2       3       3
6        2       0      3       5       3
7        2       0      3       5       4
8        2       0      3       5       5
9        3       1      4       6       4
10       3       1      4       6       5
11       3       1      4       6       6
0 голосов
/ 25 мая 2018

Вычислите разницу и позвоните Index.repeat:

idx = df.index.repeat(df.value2 - df.value + 1)

Теперь либо используйте reindex:

df = df.reindex(idx).reset_index(drop=True)

Или loc:

df = df.loc[idx].reset_index(drop=True)

И вы получите

df
    class1  class2  value  value2
0        1       0      1       4
1        1       0      1       4
2        1       0      1       4
3        1       0      1       4
4        2       1      2       3
5        2       1      2       3
6        2       0      3       5
7        2       0      3       5
8        2       0      3       5
9        3       1      4       6
10       3       1      4       6
11       3       1      4       6

Для второй части вашего вопроса вам понадобится groupby.cumcount:

s = idx.to_series()
df['value3'] =  df['value'] + s.groupby(idx).cumcount().values
df
    class1  class2  value  value2  value3
0        1       0      1       4       1
1        1       0      1       4       2
2        1       0      1       4       3
3        1       0      1       4       4
4        2       1      2       3       2
5        2       1      2       3       3
6        2       0      3       5       3
7        2       0      3       5       4
8        2       0      3       5       5
9        3       1      4       6       4
10       3       1      4       6       5
11       3       1      4       6       6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...