Фильтр вперед кол 1 без итерации - PullRequest
1 голос
/ 22 октября 2019

Я имею дело с «водопадной» структурой DataFrame в Pandas, Python.

Столбец 1 заполнен, в то время как остальная часть набора данных в основном пуста, представляя серии, доступные только для подмножества общего периода. рассмотрено:

Instrument AUPRATE. AIB0411 AIB0511 AIB0611  ... AIB1120 AIB1220 AIB0121 AIB0221
Field                                        ...                                
Date                                         ...                                
2011-03-31     4.75   4.730   4.710   4.705  ...     NaN     NaN     NaN     NaN
2011-04-29     4.75   4.745   4.750   4.775  ...     NaN     NaN     NaN     NaN
2011-05-31     4.75     NaN   4.745   4.755  ...     NaN     NaN     NaN     NaN
2011-06-30     4.75     NaN     NaN   4.745  ...     NaN     NaN     NaN     NaN
2011-07-29     4.75     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN
            ...     ...     ...     ...  ...     ...     ...     ...     ...
2019-05-31     1.50     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN
2019-06-28     1.25     NaN     NaN     NaN  ...   0.680     NaN     NaN     NaN
2019-07-31     1.00     NaN     NaN     NaN  ...   0.520   0.530     NaN     NaN
2019-08-30     1.00     NaN     NaN     NaN  ...   0.395   0.405   0.405     NaN
2019-09-30     1.00     NaN     NaN     NaN  ...   0.435   0.445   0.445    0.45

Что я хотел бы сделать, это переместить значения из «AUPRATE» в начало данных в каждой строке (чтобы они эффективно представляли нулевое наблюдение). Там, где значения AUPRATE не смежны с набором данных, их следует заменить на NaN.

Возможно, я мог бы написать замаскированный цикл для этого, но мне было интересно, существует ли эффективный способ достижения того же результата.

Я очень новичок в пандах и Python. Заранее спасибо.

[править]

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

Instrument AUPRATE. AIB0411 AIB0511 AIB0611  ... AIB1120 AIB1220 AIB0121 AIB0221
Field                                        ...                                
Date                                         ...                                
2011-03-31     4.75   4.730   4.710   4.705  ...     NaN     NaN     NaN     NaN
2011-04-29     4.75   4.745   4.750   4.775  ...     NaN     NaN     NaN     NaN
2011-05-31     NaN     4.75   4.745   4.755  ...     NaN     NaN     NaN     NaN
2011-06-30     NaN     NaN     4.75   4.745  ...     NaN     NaN     NaN     NaN
2011-07-29     NaN     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN

Я реализовал следующее, основываясь на предложении ниже. Я все равно был бы счастлив, если бы был способ сделать это без итерации.

for i in range(AU_furures_rates.shape[0]):                                                              #iterate over rows
    for j in range(AU_furures_rates.shape[1]-1):                                                        #iterate over cols
        if (pd.notnull(AU_furures_rates.iloc[i,j+1])) and pd.isnull(AU_furures_rates.iloc[i,1]):        #move rate when needed
            AU_furures_rates.iloc[i,j] = AU_furures_rates.iloc[i,0]
            AU_furures_rates.iloc[i,0] = "NaN"
            break

1 Ответ

1 голос
/ 22 октября 2019

Может быть, кто-то найдет «более чистое» решение, но я подумал о том, чтобы сначала перебрать столбцы, чтобы проверить каждую строку, являющуюся столбцом, значение которого нужно заменить (в обратном направлении, чтобы оно закончилосьс первым появлением) с помощью:

df['column_to_move'] = np.nan
cols = df.columns.tolist()
for i in range(len(df) - 2, 1, -1):
    df.loc[pd.isna(df[cols[i]]) & pd.notna(df[cols[i + 1]]), 'column_to_move'] = cols[i]

А затем итерируйте столбцы, чтобы заполнить значение от AUPRATE. до необходимого значения, и измените AUPRATE. с помощью np.nan с помощью:

for col in cols[2: -1]: df.loc[df['column_to_move'] == col, col] = df['AUPRATE.'] df.loc[df['column_to_move'] == col, 'AUPRATE.'] = np.nan df.drop('column_to_move', axis=1, inplace=True)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...