#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. Я ценю быструю помощь.