2014-11-20 4 views
0

Предположим, у меня есть dataframe как:Как указать метод fillna в панд

1. A B 
2. a1 b1 
3. a2 NaN 
4. a3 NaN 

Как заполнить пренебрежимо малых с сказать (b1/a1)*a2 и (b1/a1)*a3

я думаю что-то вроде df.apply(pd.Series.my_function) должен быть использован. Может ли кто-нибудь помочь мне с этим?

Редактировать: Мое представление, быть может быть, вводит в заблуждение. NaNs могут прийти где угодно в dataframe, и я хочу заполнить NaN с (ближайший non-NaN B/ближайший non-NaN A) * a2.

ответ

0
df = pd.DataFrame(np.reshape(np.arange(10), (5,2)), columns = ['A', 'B']) 
df.iloc[2,1] = np.nan 
df.iloc[3,1] = np.nan 
df['C'] = df['B']/df['A'] 
df['C'] = df['C'].ffill() 
nan= df[pd.isnull(df).any(1) == True] 
nan['B'] = (nan['C'])*(nan['A']) 
bla = pd.merge(df, nan, how = 'left', left_index=True, right_index=True) 
bla['B_x'][bla['B_x'].isnull()] = bla['B_y'][bla['B_x'].isnull()] 

Это решило мою проблему, поскольку A никогда не может быть 0/NaN. Я думаю, что ответ Красита был бы полезен, когда A может быть 0/NaN.

0

Если я правильно понимаю, что вы ищете что-то вроде:

>>> df = pd.DataFrame([[i, 20+i] for i in range(10)], columns=['a','b']) 
>>> df['b'][[3,4,5,8]] = np.nan 
>>> print df 
    a b 
0 0 20 
1 1 21 
2 2 22 
3 3 NaN 
4 4 NaN 
5 5 NaN 
6 6 26 
7 7 27 
8 8 NaN 
9 9 29 
>>> nan_indices = df.index[np.logical_not(df['b'] < np.inf)].values 
>>> for nan_index in nan_indices: 
...  last_non_nan_before_nan = np.where(df['b'][:nan_index].values < np.inf)[0][-1] 
...  first_non_nan_after_nan = nan_index + 1 + (np.where(df['b'][nan_index+1:] < np.inf))[0][0] 
...  if nan_index - last_non_nan_before_nan >= first_non_nan_after_nan - nan_index: 
...   index_of_closest_non_nan_value = first_non_nan_after_nan 
...  else: 
...   index_of_closest_non_nan_value = last_non_nan_before_nan 
...  df['b'][nan_index] = df['b'][index_of_closest_non_nan_value]/\ 
...       df['a'][index_of_closest_non_nan_value] * \ 
...       df['a'][nan_index] 
... 
>>> print df 
    a   b 
0 0 20.000000 
1 1 21.000000 
2 2 22.000000 
3 3 33.000000 
4 4 44.000000 
5 5 21.666667 
6 6 26.000000 
7 7 27.000000 
8 8 25.777778 
9 9 29.000000 

Вам придется компенсировать крайние случаи (если b равно 0), если есть NaN на начало или конец DataFrame и т. д.).

Смежные вопросы