我正在处理Pandas,Python中的“瀑布”结构DataFrame。

第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

最佳答案

也许有人会找到一个“更清洁”的解决方案,但是我想到的是首先遍历各列,以检查每一行,这是您需要替换其值的列(向后,这样它将以第一个结束发生):

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.nandf.drop('column_to_move', axis=1, inplace=True)

关于python - 过滤前col 1,无需迭代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58496987/

10-11 06:59