【发布时间】:2020-07-09 05:53:16
【问题描述】:
我有 2 个 Pandas 数据框,X_ol 和 y_ol,形状分别为 29000 x 29 和 29000 x 21,我正在对这些数据运行嵌套 for 循环以生成更多数据(如下所示)。我试图用这个 for 循环实现的是这样的:
DataFrame X_ol DataFrame y_ol
id Date c1 c2 c3 c1 c2 c3
1 2000 0 1 1 0 1 1
2 2001 1 0 1 1 0 1
3 2002 1 1 0 1 1 0
4 2003 1 1 1 1 1 1
# (New DataFrame X) # (Second New DataFrame, y)
id Date c1 c2 c3 c1 c2 c3
1 2000 0 0 1 0 1 0
1 2000 0 1 0 0 0 1
2 2001 0 0 1 1 0 0
2 2001 1 0 0 0 0 1
3 2002 0 1 0 1 0 0
3 2002 1 0 0 0 1 0
4 2003 0 1 1 1 0 0
4 2003 1 0 1 0 1 0
4 2003 1 1 0 0 0 1
所以它逐行查看 y_ol 数据帧,对于每个值为 1 的单元格,它在数据帧 X 中创建一个新行,该单元格关闭,并在 y 数据帧中创建一个新行,相应单元格打开并且现在将关闭 y Dataframe 中同一行上的所有其他值。 我编写了这段代码,它正确地完成了它,但花费了很多时间。 12 多分钟生成 2 个 60,000 行的数据帧,是否有内置的 pandas 函数/方法可用于提高效率或完全消除 for 循环的另一种方法?
for i in range(len(y_ol)):
ab = y_ol.iloc[i].where(y_ol.iloc[i]==1)
abInd = ab[ab==1.0].index
for j in abInd:
y_tmp = deepcopy(y_ol.iloc[i:i+1, :])
y_ol[j][i] = 0
conc = pd.concat([X_ol.iloc[i:i+1,:], y_ol.iloc[i:i+1, :]], axis=1)
X = X.append(conc)
y_tmp.iloc[:, :] = 0
y_tmp[j] = 1
y = y.append(y_tmp)
y_ol[j][i] = 1
提前致谢
【问题讨论】:
-
可以肯定的是,列 c1、c2 和 c3 是相同的,在 X_ol 和 y_ol 之间按行排列?
-
@Ben.T 是的