Как добавить случайные значения в фрейм данных Pandas с определенным набором условий - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь условно добавить случайные значения в ожидаемый диапазон.

data =

LOT NO  QTY(Kgs)    % PICK      11C     12C     13C      14C    15C     16C
H19       312        6.22                       
H20       936        18.67                      
H21       989        19.72                      
H22       559        11.15                      
H23       639        12.74                      
H24       736        14.68                      
H25       843        16.81

Где от 11c до 16C - столбцы с нулевыми значениями (nans) или нулями.

Я хочу добавить или заменить на случайные значения (int & float) набором условий

  1. Средняя сумма значений в столбце 11C должна находиться в диапазоне между9-12.5.
  2. Средняя сумма значений в столбце 12C должна находиться в диапазоне 43-47. 3. 4. Другие условия ниже
11C    |    12C   |     13C  |   14C    |     15C    |   16C
--------------------------------------------------------------
9-12.5 |  45+/-2  |  205-230 |  5.0-6.0 |  <1000     |  <1500
---------------------------------------------------------------

Мой ожидаемый результат:

LOT NO    QTY (Kgs)   % PICK    11C     12C     13C  14C    15C 16C
H19       312          6.22     10.50   45.30   247  5.46   53  430
H20       936          18.67    10.38   48.48   265  5.64   67  280
H21       989          19.72    10.62   44.38   264  5.66   73  325
H22       559          11.15    10.97   43.52   226  5.54   62  365
H23       639          12.74    10.89   46.53   205  5.71   84  345
H24       736          14.68    11.09   43.76   165  5.62   93  230
H25       843          16.81    11.01   39.96   137  5.68   95  160

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

ОБНОВЛЕНО

Хорошо, скажем, df2 - ваш начальный DataFrame. Вот пример использования dictionary для условий:

import pandas as pd
import numpy as np

df = pd.DataFrame()
df2 = pd.DataFrame([[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]],
      columns=['11C', '12C', '13C', '14C', '15C', '16C'])


def n(_min, _max=None, rows=7, getint=None):
    if getint == 'AVG':
        return [round(x, 2) for x in _min + (_max - _min) * np.random.rand(rows)]
    _min = int(_min / rows)
    return np.random.choice(_min, rows)


conditions = {'11C': n(9, 12.5, getint='AVG'), '12C': n(43, 47, getint='AVG'), '13C': n(205, 230, getint='AVG'),
              '14C': n(5, 6, getint='AVG'), '15C': n(1000, None), '16C': n(1500, None)}
for key, val in conditions.items():
    df[key] = val

print(df)
df2.update(df)

df2.update(df) обновит всеключи df, которые находятся в df2, но убедитесь, что они имеют одинаковое количество строк, в то время как update() обновит существующее количество строк.

Результат

     11C    12C     13C   14C  15C  16C
0  11.37  43.43  223.43  5.66  126  181
1  11.67  45.08  217.87  5.80   91   16
2   9.39  43.95  218.13  5.24   69   71
3  12.23  44.74  215.62  5.87   11  129
4  12.42  45.86  209.75  5.05    5  132
5   9.49  45.28  227.34  5.83    2    4
6   9.35  45.08  218.40  5.34  129   48

0 голосов
/ 17 октября 2019

вы можете сделать это, как показано ниже, используя функции np.random

df = pd.DataFrame()
n_rows = 10
df["11C"] = 9+ (12.5-9)*np.random.rand(n_rows)
df["12C"] = 43+ (47-43)*np.random.rand(n_rows)
df["13C"] = 205+ (330-205)*np.random.rand(n_rows)
df["14C"] = 5+ (5-6)*np.random.rand(n_rows)

df["15C"] = np.random.choice(1000, n_rows)
df["15C"] = np.random.choice(1500, n_rows)
df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...