создать диапазон и сумму с помощью панды питона - PullRequest
0 голосов
/ 04 сентября 2018

У меня следующая структура данных:

      speed            frequency_count
      900.0                5
      902.0                1
      905.0                8
      906.0                1
      910.0               15
      911.0                1
      914.0                1
      915.0               45
      916.0                4

Первоначально эти данные были 2 списками, я пытался зациклить и создать новый словарь, но мне это не удалось. Мой ожидаемый результат, результатом также может быть словарь. Это не имеет значения на самом деле.

      speed            frequency_count          range              sum_freq
      900.0                5                   900-950                15
      902.0                1                   900-950                15
      905.0                8                   900-950                15
      956.0                1                   900-950                15
      960.0               15                   950-1000               17
      981.0                1                   950-1000               17
      944.0                1                   950-1000               17

Если данные были в формате списка:

   x_list = [900.0, 902.0, 905.0, 906.0, 950.0, 951.0, 954.0, 955.0, 986.0, 987.0]

   y_list= [5, 1, 8, 1, 15, 1, 1, 45, 4, 5]

Как можно преобразовать в словарь диапазонов или 2 списка групп? Огромное спасибо за то, что я на самом деле пытаюсь изучить различные манипуляции с форматом, а не панды.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вторая часть такая же, как у @ jezrael's, но первая - нет.

Но в любом случае,

Использование pandas.DataFrame.apply + pandas.DataFrame.transform:

df['range'] = df['speed'].apply(lambda x: '900-950' if x in range(900,950) else '950-1000')
df['sum_freq'] = df.groupby('range')['frequency_count'].transform(sum)
print(df)

Выход:

   speed  frequency_count     range  sum_freq
0  900.0                5   900-950        15
1  902.0                1   900-950        15
2  905.0                8   900-950        15
3  956.0                1  950-1000        17
4  960.0               15  950-1000        17
5  981.0                1  950-1000        17
6  944.0                1   900-950        15
0 голосов
/ 04 сентября 2018

Использование cut с GroupBy.transform:

df['range'] = pd.cut(df['speed'], 
                     bins=[900,950,1000], 
                     labels=['900-950','950-1000'], 
                     include_lowest=True)
df['sum_freq'] = df.groupby('range')['frequency_count'].transform('sum')
print (df)
   speed  frequency_count     range  sum_freq
0  900.0                5   900-950        15
1  902.0                1   900-950        15
2  905.0                8   900-950        15
3  956.0                1  950-1000        17
4  960.0               15  950-1000        17
5  981.0                1  950-1000        17
6  944.0                1   900-950        15

Более динамичное решение с этикетками из лотков:

x_list = [900.0, 902.0, 905.0, 906.0, 950.0, 951.0, 954.0, 955.0, 986.0, 987.0]
y_list= [5, 1, 8, 1, 15, 1, 1, 45, 4, 5]
df = pd.DataFrame({'speed':x_list, 'frequency_count':y_list})

bins = [900,950,1000]
labels = ['{}-{}'.format(i + 1, j) for i, j in zip(bins[:-1], bins[1:])] 
labels[0] = '{}-{}'.format(bins[0], bins[1])

df['range'] = pd.cut(df['speed'], bins=bins, labels=labels, include_lowest=True)
df['sum_freq'] = df.groupby('range')['frequency_count'].transform('sum')
print (df)
   speed  frequency_count     range  sum_freq
0  900.0                5   900-950        30
1  902.0                1   900-950        30
2  905.0                8   900-950        30
3  906.0                1   900-950        30
4  950.0               15   900-950        30
5  951.0                1  951-1000        56
6  954.0                1  951-1000        56
7  955.0               45  951-1000        56
8  986.0                4  951-1000        56
9  987.0                5  951-1000        56
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...