Копировать значение столбца в следующие несколько строк в pandas - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть фрейм данных, в котором у меня есть один уникальный столбец с несколькими столбцами, как показано ниже:

   UniqueNumber Values
0   69444108688 500
1   66023511069 100
2   53313124505 200
3   95336385161 300
4   53923124505 400
5   96498947724 250
6   38933995601 430
7   13182151675 595
8   68184277619 792
9   87329074618 800

Размер фрейма данных составляет около 1000, и я пытаюсь взять несколько случайных выборок и повторить значения из каждых четырех последовательные значения столбца «UniqueNumber» с его значением на каждой 5-й позиции. Мой ожидаемый вывод выглядит следующим образом:

   UniqueNumber Values
0   69444108688 500
1   69444108688 100
2   69444108688 200
3   69444108688 300
4   69444108688 400
5   96498947724 250
6   96498947724 430
7   96498947724 595
8   96498947724 792
9   96498947724 800

Я пытаюсь сделать это следующим образом. Это меняет тип данных столбца на тип с плавающей точкой. Я ищу любой эффективный способ добиться этого в pandas.

Ниже мой код

df_sample =  df.sample(100)
unique_vals = df_sample['UniqueNumber'].tolist()

for i in range(0,len(unique_vals) - 1, 1):
    if i%5 !=0 :
        unique_vals[i] = np.nan

df_sample['UniqueNumber'] = unique_vals

df_sample['UniqueNumber'].ffill(axis = 0, inplace = True)

1 Ответ

1 голос
/ 27 апреля 2020

Если индекс по умолчанию RangeIndex, вы можете использовать целочисленное деление на 5, а затем использовать GroupBy.transform с GroupBy.first:

df['UniqueNumber'] = df.groupby(df.index // 5)['UniqueNumber'].transform('first')

Или если некоторые общие значения индекса создают вспомогательный массив:

df['UniqueNumber'] = df.groupby(np.arange(len(df)) // 5)['UniqueNumber'].transform('first')
print (df)
   UniqueNumber  Values
0   69444108688     500
1   69444108688     100
2   69444108688     200
3   69444108688     300
4   69444108688     400
5   96498947724     250
6   96498947724     430
7   96498947724     595
8   96498947724     792
9   96498947724     800

Другая идея заключается в преобразовании значений с плавающей запятой с отсутствующими значениями в целые числа :

m = np.arange(len(df)) % 5 == 0
df['UniqueNumber'] = df['UniqueNumber'].where(m).astype('Int64').ffill().astype('int64')
print (df)
   UniqueNumber  Values
0   69444108688     500
1   69444108688     100
2   69444108688     200
3   69444108688     300
4   69444108688     400
5   96498947724     250
6   96498947724     430
7   96498947724     595
8   96498947724     792
9   96498947724     800
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...