【问题标题】:How to fill pandas dataframe columns in for loop如何在for循环中填充熊猫数据框列
【发布时间】:2019-05-11 20:18:50
【问题描述】:

我正在尝试在 for 循环中填充 pandas 数据框列。列名是参数化的,由循环值分配。这是我的代码:

for k in range (-1, -4, -1):
    df_orj = pd.read_csv('something.csv', sep= '\t') 

    df_train = df_orj.head(11900)   
    df_test = df_orj.tail(720) 

    SHIFT = k

    df_train.trend = df_train.trend.shift(SHIFT)
    df_train = df_train.dropna()
    df_test.trend = df_test.trend.shift(SHIFT)
    df_test = df_test.dropna()

    drop_list = some_list

    df_out = df_test[['date','price']]
    df_out.index = np.arange(0, len(df_out)) # start index from 0
    df_out["pred-1"] = np.nan
    df_out["pred-2"] = np.nan
    df_out["pred-3"] = np.nan

    df_train.drop(drop_list, 1, inplace = True )
    df_test.drop(drop_list, 1, inplace = True )

    # some processes here

    rf = RandomForestClassifier(n_estimators = 10)
    rf.fit(X_train,y_train)
    y_pred = rf.predict(X_test)
    print("accuracy score: " , rf.score(X_test, y_test))


    X_test2 = sc.transform(df_test.drop('trend', axis=1))
    y_test2 = df_test['trend'].values

    y_pred2  = rf.predict(X_test2)
    print("accuracy score: ",rf.score(X_test2, y_test2))


    name = "pred{0}".format(k)
    for i in range (0, y_test2.size):
        df_out[name][i] = y_pred2[i]

df_out.head(20)

这是我的输出:

                time_period_start  price_open  pred-1  pred-2  pred-3
697  2018-10-02T02:00:00.0000000Z       86.80     NaN     NaN     1.0
698  2018-10-02T03:00:00.0000000Z       86.65     NaN     NaN     1.0
699  2018-10-02T04:00:00.0000000Z       86.32     NaN     NaN     1.0

如您所见,仅填充了pred-3。如何填写所有 3 个预定义的列?

【问题讨论】:

  • 您正在重新初始化这些列以在您的 for 循环中变为 null。将 df_out[“pred-1”] = np.nan 移到 for 循环之前
  • @chitown88 哦,我真傻。由于我重新初始化了列,因此我丢失了前 2 列信息。您能否发布正确的代码作为答案,以便我接受?
  • 是的。不用担心。容易的大脑放屁......一直在发生。我认为我们都曾在某个时候这样做过。我可以保证我以后也会犯同样的错误。

标签: python pandas loops numpy


【解决方案1】:

如果我理解正确,那么您的问题是您正在获得 pred-3 仅在其他两个为 nan 的地方填充。 这是因为您的 df_out 在循环中,并且您正在获得最后的结果 循环的迭代。 您应该在循环之外定义它,这样您的信息就不会丢失 另外两个。

【讨论】:

  • 谢谢,你的回答和@chitown88的一样。
【解决方案2】:

您在每个循环中将这 3 列设置为空值,因此您在迭代时会丢失这些值。将那些初始化列移到循环之前,或者您可以使用以下变量进行初始化:

更换

df_out["pred-1"] = np.nan
df_out["pred-2"] = np.nan
df_out["pred-3"] = np.nan

仅在循环时初始化单个列

name = "pred{0}".format(k)
df_out[name] = np.nan

那么完整的代码:

for k in range (-1, -4, -1):
    df_orj = pd.read_csv('something.csv', sep= '\t') 

    df_train = df_orj.head(11900)   
    df_test = df_orj.tail(720) 

    SHIFT = k

    df_train.trend = df_train.trend.shift(SHIFT)
    df_train = df_train.dropna()
    df_test.trend = df_test.trend.shift(SHIFT)
    df_test = df_test.dropna()

    drop_list = some_list

    df_out = df_test[['date','price']]
    df_out.index = np.arange(0, len(df_out)) # start index from 0

    name = "pred{0}".format(k)
    df_out[name] = np.nan

    df_train.drop(drop_list, 1, inplace = True )
    df_test.drop(drop_list, 1, inplace = True )

    # some processes here

    rf = RandomForestClassifier(n_estimators = 10)
    rf.fit(X_train,y_train)
    y_pred = rf.predict(X_test)
    print("accuracy score: " , rf.score(X_test, y_test))


    X_test2 = sc.transform(df_test.drop('trend', axis=1))
    y_test2 = df_test['trend'].values

    y_pred2  = rf.predict(X_test2)
    print("accuracy score: ",rf.score(X_test2, y_test2))



    for i in range (0, y_test2.size):
        df_out[name][i] = y_pred2[i]

df_out.head(20)

【讨论】:

  • 我将列移出循环。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2015-03-19
  • 2022-01-08
  • 1970-01-01
  • 2015-09-19
  • 2017-10-29
相关资源
最近更新 更多