Как сгруппировать столбец с категориями, за которым следует числовой столбец, и на основе этой группы объединить числовые значения - PullRequest
1 голос
/ 24 мая 2019

У меня есть набор данных, в котором столбец «Тип» в основном состоит из фигур, и в соответствии с этим столбец «Объем» состоит из объема для этой формы

Теперь мне нужно выполнить следующую задачу:

  1. Группировка по форме
  2. И для каждой фигуры, группировка по объему
  3. И для каждой фигуры и объема задайте диапазон и ячейки формы

Вход:

 Type             Volume

 Cylinder          100
 Square            300
 Cylinder          200
 Oval              100
 Square            320
 Cylinder          150
 Oval              600
 Round             1000
 Square            900
 Round             1500

Выход:

 Type              Volume       Bin

 Cylinder          100            1
 Cylinder          150            1
 Cylinder          200            2
 Oval              100            1
 Oval              600            3
 Round             1000           1
 Round             1500           2
 Square            300            1
 Square            320            1
 Square            900            3

Корзина будет выглядеть следующим образом:

1. Цилиндр -> Корзина 1 (100-200), Bin2 (201-300) ....

2.Oval -> Bin1 (100-200), ..... Bin3 (500-600) .... ....

Код:

  grouped=df_dim.groupby('Type', as_index=False)
  def test(group):
     return group.reset_index()
  def group_vol(group):
     groupedVol = 
         group.groupby(pd.cut(group["Target_BrimVol"],
         np.arange(0,5000,200)),as_index=False)

     return groupedVol.apply(test)

  gr = grouped.apply(group_vol)
  print(gr)

1 Ответ

1 голос
/ 27 мая 2019

Я думаю, вы можете попробовать код ниже.

testdf = df.groupby('Type',as_index=False).apply(lambda x: x.groupby(pd.cut(x["Vol"],np.arange(x["Volume"].min(),x["Volume"].max(),200)),as_index=False).apply(test))

Здесь происходит следующее: первый groupby в основном группирует Dataframe в категорию «Тип», а затем вы хотите сгруппировать его по диапазонам. Для этого вы можете снова сгруппировать его, используя лямбда-функцию, используя функцию pd.cut, чтобы сделать небольшие отрезки интервала в зависимости от вашего диапазона. В этом случае я просто беру максимальное и минимальное значение и обрезаю его с интервалами в 200. После этого, если вы хотите снова объединить выходные данные, образуя Dataframe снова, используйте еще одно приложение для их объединения. как это,

def test(group):
   #Write your function here. Whatever you want to perform.
   return group.merge(group)

И я использую as_index=False, чтобы сбросить индекс здесь, чтобы реструктурировать кадр данных в соответствии с новым индексом.

Надеюсь, это поможет.

Edit: - Для бункеров вам не нужно беспокоиться, потому что каждый groupby создает новый индекс, который вы можете использовать для своих целей. Как в,

Index1  Index2  Type  Volume
0 0 Cylinder  100
0 0 Cylinder  140
0 1 Cylinder  250
1 0 Oval  154
1 4 Oval 999
2 1 Circle  328
...