2016-01-14 3 views
3

У меня есть кадр данных pandas, где я хотел бы заменить некоторые уникальные значения случайным нормальным числом. В приведенном ниже примере, значение для замены составляет 0.заменить уникальные значения в кадре данных pandas со случайными номерами

import numpy as np 
import pandas as pd 

dates = pd.date_range('20160101', periods=10) 
x = [1.0,2.0,10.0,9.0,0,7.0,6.0,0,3.0,9.0] 
df = pd.DataFrame(x,index=dates,columns=['A']) 

      A 
2016-01-01 1.000000 
2016-01-02 2.000000 
2016-01-03 10.000000 
2016-01-04 9.000000 
2016-01-05 0.000000 
2016-01-06 7.000000 
2016-01-07 6.000000 
2016-01-08 0.000000 
2016-01-09 3.000000 
2016-01-10 9.000000 

Это то, что у меня есть:

df['A'] = df.A.replace(to_replace =0, value = np.random.normal(0,1)) 

который заменяет нули с тем же значением.

A 
2016-01-01 1.000000 
2016-01-02 2.000000 
2016-01-03 10.000000 
2016-01-04 9.000000 
2016-01-05 6.993988 
2016-01-06 7.000000 
2016-01-07 6.000000 
2016-01-08 6.993988 
2016-01-09 3.000000 
2016-01-10 9.000000 

Я хотел бы получить разные значения. Как я могу это сделать?

ответ

2

У меня была аналогичная проблема, в последнее время и создали функцию. Попробуйте эту модифицированную функцию:

def replace_zeros_w_random_normal(DF,label, mu, sigma): 
    truth_1 = DF[label] == 0 
    random = np.random.normal(mu, sigma, DF.shape[0]) 
    filt = DF[DF[label] > 0] 
    vector_1 = truth_1 * random 
    truth_2 = vector_1 == 0 
    vector_2 = truth_2 * DF[label] 
    DF[label] = np.maximum(vector_1,vector_2) 
    return DF 

Затем запустите:

replace_zeros_w_random_normal(df,'A ,1,0.1) 
3

Попробуйте это:

In [51]: 
dates = pd.date_range('20160101', periods=10) ​ 
x = [1.0,2.0,10.0,9.0,0,7.0,6.0,0,3.0,9.0] 
df = pd.DataFrame(x,index=dates,columns=['A']) ​ 
df 

Out[51]: 
      A 
2016-01-01 1 
2016-01-02 2 
2016-01-03 10 
2016-01-04 9 
2016-01-05 0 
2016-01-06 7 
2016-01-07 6 
2016-01-08 0 
2016-01-09 3 
2016-01-10 9 

In [56]: 
df.loc[df['A'] == 0,'A'] = np.random.normal(0,1, len(df.loc[df['A'] == 0])) 
df 

Out[56]: 
        A 
2016-01-01 1.000000 
2016-01-02 2.000000 
2016-01-03 10.000000 
2016-01-04 9.000000 
2016-01-05 0.259048 
2016-01-06 7.000000 
2016-01-07 6.000000 
2016-01-08 0.623833 
2016-01-09 3.000000 
2016-01-10 9.000000 

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

Смотрите документацию: http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.random.normal.html

Также можно использовать apply здесь:

In [94]: 
df.loc[df['A'] == 0,'A'] = df['A'].apply(lambda x: np.random.normal(0,1)) 
df 

Out[94]: 
        A 
2016-01-01 1.000000 
2016-01-02 2.000000 
2016-01-03 10.000000 
2016-01-04 9.000000 
2016-01-05 2.794664 
2016-01-06 7.000000 
2016-01-07 6.000000 
2016-01-08 -0.524947 
2016-01-09 3.000000 
2016-01-10 9.000000 
Смежные вопросы