【问题标题】:ValueError: cannot reindex from a duplicate axis PandasValueError:无法从重复的轴 Pandas 重新索引
【发布时间】:2018-02-02 21:51:48
【问题描述】:

所以我有一个基于 fund_id 生成的时间序列数组:

def get_adj_nav(self, fund_id):
    df_nav = read_frame(
        super(__class__, self).filter(fund__id=fund_id, nav__gt=0).exclude(fund__account_class=0).order_by(
            'valuation_period_end_date'), coerce_float=True,
        fieldnames=['income_payable', 'valuation_period_end_date', 'nav', 'outstanding_shares_par'],
        index_col='valuation_period_end_date')
    df_dvd, skip = self.get_dvd(fund_id=fund_id)
    df_nav_adj = calculate_adjusted_prices(
        df_nav.join(df_dvd).fillna(0).rename_axis({'payout_per_share': 'dividend'}, axis=1), column='nav')
return df_nav_adj

def json_total_return_table(request, fund_account_id):
ts_list = []
for fund_id in Fund.objects.get_fund_series(fund_account_id=fund_account_id):
    if NAV.objects.filter(fund__id=fund_id, income_payable__lt=0).exists():
        ts = NAV.objects.get_adj_nav(fund_id)['adj_nav']
        ts.name = Fund.objects.get(id=fund_id).account_class_description
        ts_list.append(ts.copy())
        print(ts)
    df_adj_nav = pd.concat(ts_list, axis=1) # ====> Throws error
    cols_to_datetime(df_adj_nav, 'index')
    df_adj_nav = ffn.core.calc_stats(df_adj_nav.dropna()).to_csv(sep=',')

时间序列的示例如下:

valuation_period_end_date
2013-09-03    17.234000
2013-09-04    17.277000
2013-09-05    17.363000
2013-09-06    17.326900
2013-09-09    17.400800
2013-09-10    17.473000
2013-09-11    17.486800
2013-09-12    17.371600
....
Name: CLASS I, Length: 984, dtype: float64

另一个时间序列:

valuation_period_end_date
2013-09-03    17.564700
2013-09-04    17.608500
2013-09-05    17.696100
2013-09-06    17.659300
2013-09-09    17.734700
2013-09-10    17.808300
2013-09-11    17.823100
2013-09-12    17.704900
....
Name: CLASS F, Length: 984, dtype: float64

对于每个时间序列,长度都不同,我想知道这是否是我收到错误的原因:cannot reindex from a duplicate axis。我是 pandas 的新手,所以我想知道你们是否有任何建议。

谢谢

编辑:索引也不应该是唯一的。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    也许这样的事情会奏效。我已将 fund_id 添加到数据框并将其重新索引为 valuation_period_end_datefund_id

    # Only fourth line above error.
    ts = (
        NAV.objects.get_adj_nav(fund_id['adj_nav']
        .to_frame()
        .assign(fund_id=fund)
        .reset_index()
        .set_index(['valuation_period_end_date', 'fund_id']))
    

    然后与axis=0 堆叠,按日期和fund_id 分组(假设每个日期和fund_id 只有一个唯一值,您可以取第一个值),然后unstack fund_id 将其转为列:

    df_adj_nav = (
        pd.concat(ts_list, axis=0)
        .groupby(['valuation_period_end_date', 'fund_id'])
        .first()
        .to_frame()
        .unstack('fund_id'))
    

    【讨论】:

    • 得到一个错误:'Series'对象没有属性'assign'
    • 见上面的编辑。使用to_frame() 从系列转换为数据帧。
    • 这似乎有效,但现在我只想更改索引的名称。目前我们有这个fund_id 80 81 82 83 ,但我想要CLASS A CLASS C CLASS F SERIES 1。基本上我尝试过这样的事情:ts.name = Fund.objects.get(id=fund_id).account_class_description 但它没有用。
    • 我之所以要这样做是因为我想将表格转换为 csv 格式,我得到这个错误:TypeError: sequence item 1: expected str instance, tuple found。我认为这是因为 (fund_id 80 81 82 83)
    • 您可以在执行to_frame 命令时更改名称。 to_frame("new name") 应该可以工作。
    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多