2016-02-24 4 views
2

У меня есть DataFrame, который содержит nan значений. Я хотел бы заполнить те nan s значением индекса. Фактический прецедент заполняет nan s строковым шаблоном, содержащим значение индекса, на которое вы можете ответить в качестве бонуса.Fill pandas DataFrame nans с индексом

Дано:

In [31]: df 
Out[31]: 
      0   1   2   3 
0  NaN 0.069419  NaN  NaN 
1 2.439000 1.943944 0.279904 0.755746 
2 0.013795 1.189474 0.834894 2.202108 
3 0.520385  NaN  NaN 1.451822 
4 0.153863 0.957394  NaN 0.052726 
5 1.274204  NaN  NaN 0.169636 
6  NaN 1.031703  NaN 0.267850 
7 0.419157  NaN  NaN 0.409045 
8  NaN 1.526764 0.947936 0.442226 
9  NaN  NaN  NaN 0.458331 

и

In [35]: tmp 
Out[35]: 'i=%(idx)s' 

Выход должен быть чем-то вроде следующего:

  0   1   2   3 
0  i=0 0.069419  i=0  i=0 
1 2.439000 1.943944 0.279904 0.755746 
2 0.013795 1.189474 0.834894 2.202108 
3 0.520385  i=3  i=3 1.451822 
4 0.153863 0.957394  i=4 0.052726 
5 1.274204  i=5  i=5 0.169636 
6  i=6 1.031703  i=6 0.267850 
7 0.419157  i=7  i=7 0.409045 
8  i=8 1.526764 0.947936 0.442226 
9  i=9  i=9  i=9 0.458331 

Просто пытаюсь заполнить nan S с индексом.

Пытался

In [32]: df.fillna(df.index) 

ValueError: invalid fill value with a <class 'pandas.core.index.Int64Index'> 

Пытался

In [33]: df.replace(np.nan, df.index) 

TypeError: Invalid "to_replace" type: 'float' 

Пытался

In [41]: df.fillna(df.index.values) 

ValueError: invalid fill value with a <type 'numpy.ndarray'> 

Пытался

In [53]: df1 = df.astype(object) 

и повторяя выше, получили те же ошибки.

Использование pandas==0.17.1

ответ

3

Аналогично @maxymoo решения с использованием where, но с pd.Series вместо lambda:

s = pd.Series(['i={}'.format(i) for i in df.index]) 

In [49]: df.where(df.notnull(), s, axis=0) 
Out[49]: 
      0   1   2   3 
0  i=0 0.069419  i=0  i=0 
1  2.439 1.94394 0.279904 0.755746 
2 0.013795 1.18947 0.834894 2.20211 
3 0.520385  i=3  i=3 1.45182 
4 0.153863 0.957394  i=4 0.052726 
5 1.2742  i=5  i=5 0.169636 
6  i=6 1.0317  i=6 0.26785 
7 0.419157  i=7  i=7 0.409045 
8  i=8 1.52676 0.947936 0.442226 
9  i=9  i=9  i=9 0.458331 

газораспределительного:

def f1(): 
    nan_strings = ["i={}".format(i) for i in df.index] 
    df.apply(lambda c: c.where(c.notnull(), nan_strings)) 

def f2(): 
    s = pd.Series(['i={}s'.format(i) for i in df.index]) 
    df.where(df.notnull(), s, axis=0) 

In [51]: %timeit f1() 
100 loops, best of 3: 5.17 ms per loop 

In [52]: %timeit f2() 
1000 loops, best of 3: 1.34 ms per loop 
+0

Ницца, +1 для '% timeit' –

+0

Очень приятно, не знал об использовании' axis' для трансляции по столбцам – maxymoo

0

Итак, что вы делаете, это будет вызывать проблемы. Во-первых, ваши столбцы выглядят как все float64. 'i=%(idx)s' - это строка. Таким образом, вам придется либо преобразовать все столбцы в object, либо вам нужно будет заполнить значения float для nan. Тем не менее, почему бы вам не попробовать это, и дайте мне знать, если вы получите ответ:

df.fillna(df.index.values, inplace=True) 

Так вы говорите, бонус, давайте попробуем преобразовать столбцы object типа первой:

fill_val = ['i={}'.format(i) for i in df.index.values] 
df.astype('object', inplace=True) 
df.fillna(fill_val, inplace=True) 
+0

Должен отметить, я попытался с помощью значения индекса, не любит Numpy массивы: 'ValueError: недопустимое значение заполнения с помощью ' Понимает объект float v. –

+1

Вы можете сделать это в одной строке: 'df.astype (object, inplace = True) ' –

+0

@ strimp099: Эта ошибка может быть исправлена, если вы конвертируете ее в список:' list (df.index) '. Я все еще парень Pandas 0,13! Ха-ха, вот когда я начал, не исправлял изменений во всех функциях. – Kartik

2

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

In [1]: nan_strings = ["i={}".format(i) for i in df.index] 

In [2]: df.apply(lambda c: c.where(c.notnull(), nan_strings)) 
Out[2]: 
      0   1   2   3 
0  i=0 0.069419  i=0  i=0 
1  2.439 1.94394 0.279904 0.755746 
2 0.013795 1.18947 0.834894 2.20211 
3 0.520385  i=3  i=3 1.45182 
4 0.153863 0.957394  i=4 0.052726 
5 1.2742  i=5  i=5 0.169636 
6  i=6 1.0317  i=6 0.26785 
7 0.419157  i=7  i=7 0.409045 
8  i=8 1.52676 0.947936 0.442226 
9  i=9  i=9  i=9 0.458331 
Смежные вопросы