将两个 Pandas 行合并为一个,并具有时间序列的重复列

Combine two Pandas rows into one with duplicated columns for time series

提问人:bktllr 提问时间:6/19/2023 更新时间:6/19/2023 访问量:53

问:

我有以下问题正在尝试解决。我有两个具有相同列的 Pandas Dataframe 行:

A列 B列
单元格 1 单元格 2
单元格 3 单元格 4

我想通过附加列将两行合并为一行:

专栏 A_1 专栏 B_1 专栏 A_2 专栏 B_2
单元格 1 单元格 2 单元格 3 单元格 4

此操作用于创建窗口大小为 2 的时序行,用于训练机器学习模型。因此,我正在做数百万次这个操作,这应该需要很小的运营成本。

提前致谢!

我尝试使用 pandas concat,但它太慢了,需要很多内存

Python Pandas DataFrame 科学数据 操作

评论

0赞 smci 6/19/2023
我们需要你发布一个可重复的例子(使用随机种子生成的数据),而不是说“太慢了,需要大量的RAM”。向我们展示数字。你真的是从大量的 2x2 数据帧开始的吗?如果是这样,请对其进行优化:向我们展示生成它们的代码。另外,列的 dtypes 是什么?pd.concat

答:

2赞 Andrej Kesely 6/19/2023 #1

我希望我理解正确,但您可以尝试:

x = df.stack().reset_index()
x[''] = x['level_1'] + '_' + (x['level_0'] + 1).astype(str)
x = x[['', 0]].set_index('').T

print(x)

指纹:

  Column A_1 Column B_1 Column A_2 Column B_2
0     Cell 1     Cell 2     Cell 3     Cell 4
3赞 Corralien 6/19/2023 #2

你可以使用 stack():

out = df.stack().droplevel(0).to_frame().T
out.columns += '_' + out.groupby(level=0, axis=1).cumcount().add(1).astype(str)
print(out)

# Output
  Column A_1 Column B_1 Column A_2 Column B_2
0     Cell 1     Cell 2     Cell 3     Cell 4

如果您有多行,则可以使用:numpy.reshape

>>> pd.DataFrame(df.values.reshape(-1, 4)).add_prefix('Col_')
    Col_0   Col_1   Col_2   Col_3
0  Cell 1  Cell 2  Cell 3  Cell 4
1  Cell 1  Cell 2  Cell 3  Cell 4
1赞 MaryRa 6/19/2023 #3

也许它有帮助:

result = df.stack()
result.index = [f"{y}_{x+1}" for x,y in result.index]
result = pd.DataFrame(result).T

enter image description here

0赞 PaulS 6/19/2023 #4

另一种可能的解决方案:

(pd.DataFrame(np.hstack(df.values.T)).T
 .set_axis([f'{x}_{y+1}' for y in range(2) for x in df.columns], axis=1))

或者

from itertools import chain

(pd.DataFrame(chain(*[df[col] for col in df.columns])).T
 .set_axis([f'{x}_{y}' for y in range(1,3) for x in df.columns], axis=1))

输出:

  Column A_1 Column B_1 Column A_2 Column B_2
0     Cell 1     Cell 3     Cell 2     Cell 4