Панды копируют строки, используя петли - PullRequest
0 голосов
/ 26 октября 2018

У меня есть DataFrame, который выглядит так:

   SNFrom  SNTo  Name  Age
0       1     4  John    8
1       5     7  Jack    6

Используя pandas, я хочу получить такой результат:

   Name  Age  SN
0  John    8   1
1  John    8   2
2  John    8   3
3  John    8   4
4  Jack    6   5
5  Jack    6   6
6  Jack    6   7

Общее правило заключается в том, что я хочу добавить новые строки на основе диапазонов, указанных в SNFrom и SNTo, поэтому, например, John должен иметь строки 1-4, а Jack должен иметь строки 5-7.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вот векторизованное решение, использующее np.repeat:

s = df.SNTo - df.SNFrom
i = np.repeat(df.index, s+1)
t = df.loc[i, ['Name', 'Age', 'SNFrom']]

t.assign(SN=t.groupby(level=0).cumcount() + t.SNFrom).drop('SNFrom', 1)

   Name  Age  SN
0  John    8   1
0  John    8   2
0  John    8   3
0  John    8   4
1  Jack    6   5
1  Jack    6   6
1  Jack    6   7
0 голосов
/ 26 октября 2018

Вот довольно наивный способ использования apply:

Настройка:

df = pd.DataFrame({'SNFrom':[1,5],'SNTo':[4,7],'Name':['John','Jack'],'Age':[8,6]})
>>> df
   Age  Name  SNFrom  SNTo
0    8  John       1     4
1    6  Jack       5     7

Решение:

new_df = (df.set_index(['Name','Age'])[['SNFrom','SNTo']]
          .apply(lambda x: pd.Series(list(range(x.SNFrom, x.SNTo+1))),1)
          .stack()
          .reset_index(level=[0,1])
          .rename(columns={0:'SN'}))

>>> new_df
   Name  Age   SN
0  John    8  1.0
1  John    8  2.0
2  John    8  3.0
3  John    8  4.0
0  Jack    6  5.0
1  Jack    6  6.0
2  Jack    6  7.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...