gpt4 book ai didi

python - 在 MultiIndex DataFrame 上使用重新索引在 Pandas 中插入行

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:21 26 4
gpt4 key购买 nike

我有一个大型面板数据框,其中包含多个日期的多个 Assets 。问题是某些 Assets 并非每天都有值,因此我希望将当天的任何空白值替换为该 Assets 的最后一个可用值。

例如:

                       tradeDate   assetId  ticker    Sedol      price
0 2016-01-04 00:00:00.000 1786 3900 B17N9P6 1
1 2016-01-04 00:00:00.000 2041 1898 B1JNK84 2
2 2016-01-04 00:00:00.000 2981 CBMG B9F9PM1 3
3 2016-01-04 00:00:00.000 3547 MWA B15RZR4 4
4 2016-01-04 00:00:00.000 3570 TPLM B065Y40 5
5 2016-01-05 00:00:00.000 3995 MHGC B0YRYS2 1
6 2016-01-05 00:00:00.000 4110 DSW B0BV2V6 2
7 2016-01-05 00:00:00.000 4874 NWE B03PGL4 3
8 2016-01-05 00:00:00.000 4982 BOFI B0637D4 4
9 2016-01-05 00:00:00.000 5082 ISCTR B03MYS8 5
10 2016-01-05 00:00:00.000 5083 KCHOL B03MVJ8 6

所以我需要做的是在 tradeDate 和 assetIds 上建立索引,然后重新建立索引以便它为每个交易日期创建新行,从而始终有相同数量的 assetIds。这将创建包含 NaN 的行。我对这一步感到困惑,因为我不确定使用多个索引时的语法以及列 tradeDate 和 assetId 不完全匹配时的语法。

最后,我将不得不用最后一个可用值替换 NaN。但是,我必须再次对 tradeDate 和 assetId 的两个索引执行此操作。感谢对此的帮助

最佳答案

你问题的第一部分被巧妙地回答了here作者:TomAugspurger。

基本上,您需要使用一个巧妙的技巧,包括设置多索引、拆分数据框、填充缺失值并再次堆叠。然后,您应该再次将填充的缺失值转换为 NaN,并使用在 pandas 中实现的 .fillna() 方法和 method='ffill' 以用最后一个替换 NaN可用值。

首先,让我们生成我们需要的数据:

import pandas as pd
import numpy as np

data = [['2016-01-04 00:00:00.000', 1786, '3900', 'B17N9P6', 1],
['2016-01-04 00:00:00.000', 2041, '1898', 'B1JNK84', 2],
['2016-01-04 00:00:00.000', 2981, 'CBMG', 'B9F9PM1', 3],
['2016-01-04 00:00:00.000', 3547, 'MWA', 'B15RZR4', 4],
['2016-01-04 00:00:00.000', 3570, 'TPLM', 'B065Y40', 5],
['2016-01-05 00:00:00.000', 3995, 'MHGC', 'B0YRYS2', 1],
['2016-01-05 00:00:00.000', 4110, 'DSW', 'B0BV2V6', 2],
['2016-01-05 00:00:00.000', 4874, 'NWE', 'B03PGL4', 3],
['2016-01-05 00:00:00.000', 4982, 'BOFI', 'B0637D4', 4],
['2016-01-05 00:00:00.000', 5082, 'ISCTR', 'B03MYS8', 5],
['2016-01-05 00:00:00.000', 5083, 'KCHOL', 'B03MVJ8', 6]]

cols = ['tradeDate','assetId','ticker','Sedol','price']

然后解决问题:

df = pd.DataFrame.from_records(data, columns=cols)

# I used `-1` to fill the empty values, but use whatever value
# does not occur in the dataset
df = df.set_index(['tradeDate', 'assetId']).unstack().fillna(-1).stack()

# Once you have the data frame stacked again, you need to
# convert unknown values to np.nan again
df.replace(-1, np.nan, inplace=True)

# Fill with latest value for given assetId
df = df.groupby(level=['assetId']).fillna(method='ffill')

希望这个答案能涵盖您的问题,否则请告诉我们。

关于python - 在 MultiIndex DataFrame 上使用重新索引在 Pandas 中插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47191732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com