Разделите DataFrame на N (почти) равных сегментов - PullRequest
0 голосов
/ 06 декабря 2018

Скажем, у меня есть фрейм данных, который выглядит следующим образом:

Id  ColA
1   2           
2   2        
3   3        
4   5        
5   10       
6   12       
7   18       
8   20       
9   25       
10  26          

Я хотел бы, чтобы мой код создал новый столбец в конце DataFrame, который делит общее число наблюдений на 5 в диапазоне от5 до 1.

Id  ColA    Segment
1   2        5  
2   2        5
3   3        4
4   5        4
5   10       3
6   12       3
7   18       2
8   20       2
9   25       1
10  26       1  

Я попробовал следующий код, но он не работает:

df['segment'] = pd.qcut(df['Id'],5)

Я также хочу знать, что будет лучше, если сумма моих наблюдений не будет делитьсяна 5.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Это должно работать:

df['segment'] = np.linspace(1, 6, len(df), False, dtype=int)

Создает список целых чисел от 1 до 5 от размера вашего массива.Если вы хотите от 5 до 1, просто добавьте [::-1] в конце строки.

0 голосов
/ 06 декабря 2018

На самом деле, вы были ближе к ответу, чем вы думаете.Это будет работать независимо от того, является ли len(df) кратным 5 или нет.

bins = 5
df['Segment'] = bins - pd.qcut(df['Id'], bins).cat.codes

df
   Id  ColA  Segment
0   1     2        5
1   2     2        5
2   3     3        4
3   4     5        4
4   5    10        3
5   6    12        3
6   7    18        2
7   8    20        2
8   9    25        1
9  10    26        1

Где,

pd.qcut(df['Id'], bins).cat.codes

0    0
1    0
2    1
3    2
4    3
5    4
6    4
dtype: int8

Представляет категориальные интервалы, возвращаемые pd.qcut как целочисленные значения.


Другой пример для DataFrame с 7 строками.

df = df.head(7).copy()
df['Segment'] = bins - pd.qcut(df['Id'], bins).cat.codes

df

   Id  ColA  Segment
0   1     2        5
1   2     2        5
2   3     3        4
3   4     5        3
4   5    10        2
5   6    12        1
6   7    18        1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...