Pandas不给dataframe赋值

ao218c7q  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(94)

我写了一个函数,它创建了一个周期表,给出了一个比较值从一个系列以及一个特定的最小持续时间。
现在我最近清理了我的环境,不知何故,同一个函数不再像以前那样赋值了。然而,它仍然创建了一个正确形状的数据框架,只是不赋值,我不知道为什么。
上一次输出:

电流输出:

from datetime import datetime
import pandas as pd
pd.options.mode.chained_assignment = None
import pandas_datareader.data as web
import dataframe_image as dfi

# getting the last periods of increasing interest rates (Federal Funds Effective MONTHLY Rate) from 1965 onwards
fed_rates = web.DataReader("FEDFUNDS", "fred", 1965)
fed_rates.set_index(pd.to_datetime(fed_rates.index.date), inplace=True)

# test for empty values
print(fed_rates.index.isna().sum())

def period_df(start, duration, fed_rates=fed_rates):
    fed_rates = fed_rates[fed_rates.index >= start]

    df = pd.DataFrame(columns=["Name", "Start", "Last"])
    df.loc[df.shape[0]] = [None, None, None]

    period = 0
    j = 0

    for i in range(0, len(fed_rates) - 1):
        if (fed_rates.iloc[i + 1]["FEDFUNDS"] <= fed_rates.iloc[i]["FEDFUNDS"]) and (
            i - j >= duration
        ):
            df.loc[period]["Last"] = datetime.strftime(fed_rates.index[i], "%Y-%m-%d")
            period += 1
            if (fed_rates.index[-1] - fed_rates.index[i]).days >= 365:
                df.loc[len(df)] = [None, None, None]
                j = i
        elif (fed_rates.iloc[i + 1]["FEDFUNDS"] <= fed_rates.iloc[i]["FEDFUNDS"]) and (
            i - j < duration
        ):
            df.iloc[period]["Name"] = "Period " + str(period + 1)
            df.loc[period]["Start"] = datetime.strftime(fed_rates.index[i], "%Y-%m-%d")
            j = i

    # add last date
    df.loc[period]["Last"] = datetime.strftime(fed_rates.index[-1], "%Y-%m-%d")

    # add duration column
    df["Duration"] = (
        pd.to_datetime(df["Last"]) - pd.to_datetime(df["Start"])
    ) / np.timedelta64(1, "M")

    # export df as image
    dfi.export(
        df.style.set_properties(
            **{"background-color": "white", "color": "black", "border-color": "#948b8b"}
        ),
        "periods" + start + ".png",
    )
    return df

period_df(start="1995", duration=9)
s8vozzvw

s8vozzvw1#

在pandas中,loc/iloc操作,当它们没有设置任何东西时,只是返回数据的副本。
当你按照df.loc[row][col] = value的思路做一些事情时,它可能看起来像是loc操作设置了一些东西,但是这个“赋值”分两个阶段发生:
1.首先,df.loc[row]检索相关行的副本
1.然后,将副本的col设置为value
您可以通过将rowcol传递给loc/iloc或甚至使用at/iat来避免此问题:

df.loc[row, col] = value
df.at[row, col] = value

相关问题