2015-09-22 2 views
2

Я хотел бы заменить некоторые значения в foll. dataframe:Замена нулевых значений в dataframe с использованием другого фрейма данных

dataframe_a

Y2000 Y2001 Y2002 Y2003 Y2004 Item Item Code 
34  43  0  0   25  Test  Val 

Я хотел бы заменить значения в столбцах с числовым значением, получаемым умножением скаляра (скажет 0.5) по всем значениям в этом dataframe:

dataframe_b

Y2000 Y2001 Y2002 Y2003 Y2004 Item Item Code 
34  43  10  20  25  Test  Val 

Таким образом, в dataframe_a значения для столбца Y2002 должно быть 10 * 0,5 и значение для столбца Y2003 должно быть 20 * 0,5

В настоящее время я делаю это:

df = dataframe_a[dataframe_a == 0] 
df = df * dataframe_b * 0.5 

Однако, не знаю, как я могу обновить dataframe_a с новыми значениями

+0

насчет databrame.replace(): http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame. replace.html – Richard

+0

Я видел замену, но не уверен, как ее использовать здесь – user308827

ответ

1

Вы можете использовать булевы маску, а затем вызвать fillna:

In [58]: 
fill = df2.select_dtypes(include = [np.number]) * 0.5 
df1 = df1[df1!=0].fillna(fill) 
df1 

Out[58]: 
    Y2000 Y2001 Y2002 Y2003 Y2004 Item Item Code 
0  34  43  5  10  25 Test  Val 

Здесь df1[df1 !=0] будет производить df той же формы с значениями NaN, где условие не выполнено, вы можете затем позвонить fillna на этом d передать другой df, который заменит значения NaN, где индекс и столбцы выравниваются.

Результат булевой маски:

In [63]: 
df1[df1!=0] 

Out[63]: 
    Y2000 Y2001 Y2002 Y2003 Y2004 Item Item Code 
0  34  43 NaN NaN  25 Test  Val 
+0

Это заменяет значения «NaN», покупая их с 'df2' не скалярным множителем, как он просил. – Leb

+0

@ Leb обновлено сейчас – EdChum

+0

Выглядит неплохо, я никогда не спорю с вами о пандах – Leb

1
import pandas as pd 
import numpy as np 
randn = np.random.randn 
s = Series(randn(5), index=['a', 'b', 'c', 'd', 'e']) 
d = {'one' : Series([1., 2., 3.], index=['a', 'b', 'c']), 
    'two' : Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} 
df = pd.DataFrame(d) 
df 
df.replace(1, 12*4) # replace all values 1 by 12*4 
df 

Ref о replace(): Replace all occurrences of a string in a pandas dataframe (Python)

1
dataframe_a[dataframe_a == 0] = 0.5 * dataframe_b[dataframe_a == 0] 
2

Родовое один, в случае, если вы не знаете, расположение значения 0 :

new_df = 0.5*df2[df==0] 
new_df.fillna(df, inplace=True) 
print(new_df) 

    0 1 2 3 4  5 6 
0 34 43 5 5 25 Test Val 

Где dataframe_a является df и dataframe_b является df2

1

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

У меня нет установленных Pandas, поэтому я не могу показать пример dataframe - но он работает аналогично с массивами numpy.

>>> a 
array([1, 2, 0, 3, 4, 0, 5]) 
>>> subst 
array([10, 20, 30, 40, 50, 60, 70]) 
>>> k = -.5 
>>> np.where(a == 0, subst * k, a) 
array([ 1., 2., -15., 3., 4., -30., 5.]) 
>>> 

Одно различие с dataframe является то, что он может сделать замену на месте, и вы должны указать только другойdataframe (один со значениями заменяющих).

Наконец пример Панды:

>>> 
>>> df 
    d e f 
a 0 1 1 
b 1 1 0 
c 1 0 1 
>>> s 
    d e f 
a 10 20 30 
b 10 20 30 
c 10 20 30 
>>> k = -.5 
>>> df.where(df != 0, other = s * k) 
    d e f 
a -5 1 1 
b 1 1 -15 
c 1 -10 1 
>>> 
>>> df.where(df != 0, other = s * k, inplace = True) 
>>> df 
    d e f 
a -5 1 1 
b 1 1 -15 
c 1 -10 1 
>>> 

Some examples from the pydata site.

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