在Python中将数组连接到数据框

时间:2019-06-20 06:26:12

标签: python dataframe

我正在进行预测建模

照常

将数据拆分为 x_train,x_test,y_train,y_test

,然后在 y_pred

中获得测试预测

完成后,我想将数据放入 csv 文件

但是问题是当我尝试加入 y_pred y_test 时,它没有按预期加入。

会得到这样的东西

    Class Data    TotalCnt  0
16  3     2209    5235      
98  3     2190    4871      
07  1     2183    1342      1690
09  1     2205    1540      1540
19  3     2191    4673      
01  1     2206    3117      1005
38  3     2200    4837      
44  3     2219    4965      
04  1     2195    1340      1690
10  1     2191    1980      2002
38  3     2184    4620      
15  3     2220    4781      
18  3     2223    4872      

它删除了一些记录

我认为问题的原因是

y_pred 是来自原始数据帧的随机集预测 所以看起来应该是这样

ID      Prediction
16      1005
98      2056
07      1690
54      1690
...
.
.
.

y_pred 是一个数组,因此为了与 x_test 联接,我将其转换为数据框

一旦 y_pred 转换为数据框,它会丢失ID,因此会变成连续的1, 2, 3, 4, ...

ID      Prediction
1       1005
2       2056
3       1690
4       1690
...
.
.
.

因此,当尝试使用x_test进行连接时,它仅与两个数据框中 x_test y_pred

中存在的ID号匹配

如何将预测作为数据框而不是数组

我正在使用这个

x_train, x_test, y_train, y_test = train_test_split(x,y)
rf = RandomForestRegressor(n_estimators=10000)
rf.fit(x_train, y_train) 
y_pred = rf.predict(x_test)

. . .
. . .

def Lead0(value):
        return "0" + str(value) if value < 10 else str(value)

dNow = datetime.datetime.now()
sNow = Lead0(dNow.year) + Lead0(dNow.month) + Lead0(dNow.day) + Lead0(dNow.hour) + Lead0(dNow.minute) + Lead0(dNow.second) 

y_pred = pd.DataFrame(y_pred)
y_out = x_test
y_out = y_out.join(y_test)
y_out = y_out.join(y_pred)

y_out.to_csv(sFolder + "dfPred__" + sNow +".csv")

如何在不丢失ID顺序的情况下将数组连接到数据框

如何在不丢失ID顺序的情况下将数组转换为数据帧

1 个答案:

答案 0 :(得分:0)

  

y_pred是对来自原始数据帧的随机集的预测   y_pred是一个数组

我了解您要保留原始数据框的索引

为此,我认为您需要将旧数据框索引设为一列,然后将旧数据框系列y_pred保留为dict或dataframe,而不是数组。

import pandas as pd
df = pd.DataFrame({'Record Type': ['100', '200', '300'],
           'Value': [(1,2,3,4,5), '0,10', 1]})

  Record Type            Value
0         100  (1, 2, 3, 4, 5)
1         200             0,10
2         300                1

然后将索引重置为列:

df.reset_index(level=0, inplace=True)

   index Record Type            Value
0      0         100  (1, 2, 3, 4, 5)
1      1         200             0,10
2      2         300                1

现在,您可以保留旧数据框中的索引(现在是常规序列)和y_pred值,并将其与新数据框合并。

要将新df与旧df合并,请使用merge:

import pandas as pd

df1 = pd.DataFrame({'Record Type': ['100', '200', '300'],
           'Value': [(1,2,3,4,5), '0,10', 1]})

df1.reset_index(level=0, inplace=True)

df2 = pd.DataFrame({'Record Type': ['100', '200', '300'],
           'Value': [(1,2,3,4,5), '0,10', 1]})

df2.reset_index(level=0, inplace=True)


# to merge dataframes on column index
df_all = df1.merge(df2, on='index', indicator = True) #indicator show 
                            # if record was found in one df or both

df_all.columns #show column list
df_all = df_all[['index','Record Type_y','Value_y']] #pick only columns you want