我正在处理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/