2017-02-05 2 views
3

У меня есть Dataset, который мне нужно изменить с помощью панд. Ниже приводится деталь конкретного столбца мне нужно работать на:Как непрерывно генерировать значения в диапазоне?

df["Dependents"].value_counts() 

0  345 

1  102 

2  101 

3+  51 

Name: Dependents, dtype: int64 

df["Dependents"].notnull().value_counts() 

True  599 

False  15 

Name: Dependents, dtype: int64 

мне нужно назначить null значения, как 0, 1 или 2 один за другим. Как и для первой строки, я назначаю 0, затем следующая строка должна быть 1, а затем следующая 2. Затем снова начните с 0, пока все значения null не будут заполнены.

Как я могу это достичь?

ответ

3

IIUC вы можете сделать это следующим образом:

если у вас есть следующие DF:

In [214]: df 
Out[214]: 
    Dependents 
0   NaN 
1   0 
2   0 
3   0 
4   NaN 
5   1 
6   NaN 
7   3+ 
8   NaN 
9   3+ 
10   2 
11   3+ 
12   1 
13  NaN 

Решение:

In [215]: idx = df.index[df.Dependents.isnull()] 

In [216]: idx 
Out[216]: Int64Index([0, 4, 6, 8, 13], dtype='int64') 

In [217]: df.loc[idx, 'Dependents'] = np.take(list('012'), [x%3 for x in range(len(idx))]) 

In [218]: df 
Out[218]: 
    Dependents 
0   0 
1   0 
2   0 
3   0 
4   1 
5   1 
6   2 
7   3+ 
8   0 
9   3+ 
10   2 
11   3+ 
12   1 
13   1 
+0

Я думаю, что OP имеет столбец с «нулем» и номерами, а OP хочет заменить только значения «null» на 0,1,2 в этом столбце. – furas

+0

Да. Я должен заменить только нулевые значения, присутствующие в этом столбце. – CodeHunter

+0

@furas, спасибо! Сначала я этого не заметил. Я исправил свой ответ – MaxU

2

Подобный ответ MaxU, но используя NumPy ставить с ' wrap ".

Sample dataframe (df): 

    Dependents 
0 NaN  
1 0   
2 0   
3 0   
4 NaN  
5 1   
6 NaN  
7 3+  
8 NaN  
9 3+  
10 2   
11 3+  
12 1   
13 NaN 

idx = df.index[df.Dependents.isnull()] 
np.put(df.Dependents, idx, [0, 1, 2], mode='wrap') 

    Dependents 
0 0   
1 0   
2 0   
3 0   
4 1   
5 1   
6 2   
7 3+  
8 0   
9 3+  
10 2   
11 3+  
12 1   
13 1 
+0

Отличное решение! Я никогда не использовал 'np.put()' до – MaxU

+0

хороший! немного короткое! – CodeHunter