разделить элемент на строки pandas - PullRequest
5 голосов
/ 18 марта 2020

У меня есть данные в данных, как показано ниже. Я хочу разделить элемент на то же количество строк

>>> df
idx  a  
0  3  
1  5  
2  4 

из вышеупомянутого фрейма данных, я хочу, чтобы ниже как

>>> df
idx  a  
0  1  
1  2  
2  3
3  1
4  2
5  3
6  4
7  5
8  1
9  2
10  3
11  4  

Я пробовал несколько способов, но безуспешно.

Ответы [ 4 ]

5 голосов
/ 18 марта 2020

Понимание списка

pd.DataFrame({'a': [x + 1 for y in df['a'] for x in range(y)]})

    a
0   1
1   2
2   3
3   1
4   2
5   3
6   4
7   5
8   1
9   2
10  3
11  4
5 голосов
/ 18 марта 2020

Интересный способ

df.a.map(range).explode()+1 # may add reset_index(), however, I think keep the original index is good, and help us convert back.
Out[158]: 
idx
0    1
0    2
0    3
1    1
1    2
1    3
1    4
1    5
2    1
2    2
2    3
2    4
Name: a, dtype: object
4 голосов
/ 18 марта 2020

Вот основанный numpy:

a = (np.arange(df.a.max())+1)
m = a <= df.a.values[:,None]
df = pd.DataFrame(m.cumsum(1)[m], columns=['a'])

print(df)

    a
0   1
1   2
2   3
3   1
4   2
5   3
6   4
7   5
8   1
9   2
10  3
11  4
4 голосов
/ 18 марта 2020

Вот способ с series.repeat + Groupby. cumcount при условии, что idx является индексом, если не df.set_index('idx')['a']..rest of the code..

(df['a'].repeat(df['a']).groupby(level=0).cumcount().add(1)
        .reset_index(drop=True).rename_axis('idx'))

idx

0     1
1     2
2     3
3     1
4     2
5     3
6     4
7     5
8     1
9     2
10    3
11    4
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...