Повторное значение фрейма данных Pandas на основе условия

#python #pandas

#python #pandas

Вопрос:

Я пытаюсь повторить значения строк в фрейме данных на основе условий в столбце. Если значение в изменении столбца = 1, то я хотел бы повторить значения в столбцах A, B и C до следующего изменения = 1.

 index = pandas.date_range('20000131', periods=5)
columns = ['A', 'B', 'C', 'Change']

data = {'A': pandas.Series([False, True, False, True, False], index=index)
    , 'B': pandas.Series([True, True, False, False, False], index=index)
    , 'C': pandas.Series([True, False, True, True, True], index=index)
    , 'Change' : pandas.Series([1,0,0,1,0], index=index)}
  

Результаты:

                 A      B      C  Change
2000-01-31  False   True   True       1
2000-02-01   True   True  False       0
2000-02-02  False  False   True       0
2000-02-03   True  False   True       1
2000-02-04  False  False   True       0
  

Желаемые результаты:

                 A      B      C  Change
2000-01-31  False   True   True       1
2000-02-01  False   True   True       0
2000-02-02  False   True   True       0
2000-02-03   True  False   True       1
2000-02-04   True  False   True       0
  

Это самое близкое, что я смог получить с помощью shift() , но оно сохраняется только для одной строки. Мне нужно, чтобы оно сохранялось для N количества строк. В приведенном ниже примере оно разбивается на третью строку (или строку 2 с основанием 0).

 print pandas.DataFrame(numpy.where(pandas.DataFrame(df['Change']==1)
    , df, df.shift()))
  

Результаты:

        0      1      2  3
0  False   True   True  1
1  False   True   True  1
2  False   True  False  0
3   True  False   True  1
4   True  False   True  1
  

Спасибо.

Ответ №1:

Вы могли бы заполнить строки Change == 0 с помощью NaN и ffill:

 In [11]: df.loc[df.Change != 1, ['A', 'B', 'C']] = numpy.nan

In [12]: df
Out[12]:
             A   B   C  Change
2000-01-31   0   1   1       1
2000-02-01 NaN NaN NaN       0
2000-02-02 NaN NaN NaN       0
2000-02-03   1   0   1       1
2000-02-04 NaN NaN NaN       0

In [13]: df.ffill()
Out[13]:
            A  B  C  Change
2000-01-31  0  1  1       1
2000-02-01  0  1  1       0
2000-02-02  0  1  1       0
2000-02-03  1  0  1       1
2000-02-04  1  0  1       0
  

Если вам нужно, чтобы это были столбцы bool, затем используйте astype(bool) для каждого столбца.

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

 In [14]: df[df.Change == 1].resample('D', fill_method='ffill')
Out[14]:
            A  B  C  Change
2000-01-31  0  1  1       1
2000-02-01  0  1  1       1
2000-02-02  0  1  1       1
2000-02-03  1  0  1       1
  

Комментарии:

1. Спасибо, Энди! Вы ответили на большинство вопросов, которые я искал здесь. ffill работает отлично. На самом деле я предпочитаю единицы и 0. Я ценю быструю помощь.