Для повторяющихся строк создайте дробное значение для заполнения другого столбца - PullRequest
1 голос
/ 20 мая 2019

Я создаю набор данных из ничего. Допустим, мои данные выглядят так:

Country |Quantity |ProdBatchNo | Volume | Batch_Quantity 
--------|---------|------------|--------|----------------
Mars    |     0   | B9-3       | 1.00   | 6439.849161    
Jupiter |     0   | B9-3       | 0.50   | 6439.849161    
Neptune |     0   | B9-3       | 1.25   | 6439.849161       

Я хочу случайным образом назначить количество продукта для каждой страны, а затем рассчитать общий% Batch_Quantity, которому назначена эта страна. Единственный способ сделать это - разделить 6439/3 = (2146), тогда количество станет 1,00 x 2146 = 2146 для Марса, 0,50 x 2146 = 1073 для Юпитера и 1,25 * 2146 = 2682 для Нептуна.

Однако, когда я суммирую их, чтобы получить общий процент партии, эти цифры не складываются. Это становится 33% для Марса, 16% для Юпитера и 41% для Нептуна. Это дает 90%, но я хочу, чтобы Batch_Quantity был полностью распределен между этими странами без остатка.

Я понимаю, что это математическая проблема в той же степени, что и проблема с данными, и мне трудно объяснить, на чем я нахожусь, поскольку я сам генерирую этот набор данных , поэтому количество ProdBatchNo, назначенное стране, может быть полностью случайный , пока все Batch_Quantity распределены между странами.

Мой способ сделать это до появления повторяющихся строк для ProdBatchNo был прост - я округлил Batch_Quantity до ближайших 100, а затем разделил его на объем (размер контейнера), чтобы сгенерировать количество. Однако я хочу разделить общее количество Batch_Quantity на 3 партии продукта на основе объема и назначить их моим гипотетическим странам Марс, Юпитер и Нептун, а также сгенерировать% _Vol_allocated для каждого ProdBatchNo (от общего Batch_Quantity).

Извините, я не очень хорошо объясняю, что я ищу. Кто-нибудь следит за мной? Спасибо:)

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Это простое пропорциональное деление. Вы хотите повлиять на часть Batch_Quantity для каждой страны в отношении:

  • сумма отдельных величин должна быть равна Batch_Quantity
  • отдельные количества должны быть пропорциональны Volume

Просто сделай это:

df['%_Vol_allocated'] = (df.Volume / df.Volume.sum()) * 100
df['Quantity'] = df.Batch_Quantity * df['%_Vol_allocated'] / 100

Предполагается один пакет данных в кадре данных. Если бы вы могли иметь более одного, вы могли бы группировать на ProdBatchNo:

for _, sub in df.groupby('ProdBatchNo'):
    df.loc[sub.index, '%_Vol_allocated'] = sub.Volume / sub.Volume.sum() * 100
    df.loc[sub.index, 'Quantity'] = sub.Batch_Quantity * sub['%_Vol_allocated'] / 100
0 голосов
/ 20 мая 2019
df=pd.DataFrame({"Country":['Mars','Jupiter','Neptune'],"Quantity":['0','0','0'],"ProdBatchNo":["B9-3","B9-3","B9-3"],
                 "Volume":["1.00","0.50","1.25"],"Batch_Quantity":["6439.849161","6439.849161","6439.849161"]})





countries=df['Country'].count()

df['Quantity']=(df['Volume'].astype(float)*df['Batch_Quantity'].astype(float)/countries)
sum_Quantity=df['Quantity'].sum()
Batch_Quantity=df['Batch_Quantity'][0]
rest=float(Batch_Quantity)-float(sum_Quantity)
rest_to_add=rest/3
df['New_Quantity']=df['Quantity']+rest_to_add
df['%_Vol_allocated']=((df['New_Quantity'].astype(float)/df['Batch_Quantity'].astype(float))*100).round(2)
print(df)

  Batch_Quantity  Country ProdBatchNo     Quantity Volume  New_Quantity  %_Vol_allocated
0    6439.849161     Mars        B9-3  2146.616387   1.00   2325.501086            36.11
1    6439.849161  Jupiter        B9-3  1073.308194   0.50   1252.192892            19.44
2    6439.849161  Neptune        B9-3  2683.270484   1.25   2862.155183            44.44

сейчас %_Vol_allocated из New_Quantity составляет около 100% в столбце ['New_Quantity'] вы можете увидеть обновленные значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...