我有数据框,我想在忽略索引的同时水平连接。
我知道对于算术运算,如果您使用 numpy 数组.values而不是 pandas 系列,则忽略索引会导致显着的加速。是否可以在忽略索引的同时水平连接或合并 Pandas 数据帧?(令我沮丧的是,ignore_index=True 会做其他事情。)如果是这样,它会提高速度吗?
import pandas as pd
df1 = pd.Series(range(10)).to_frame()
df2 = pd.Series(range(10), index=range(10, 20)).to_frame()
pd.concat([df1, df2], axis=1)
# 0 0
# 0 0.0 NaN
# 1 1.0 NaN
# 2 2.0 NaN
# 3 3.0 NaN
# 4 4.0 NaN
# 5 5.0 NaN
# 6 6.0 NaN
# 7 7.0 NaN
# 8 8.0 NaN
# 9 9.0 NaN
# 10 NaN 0.0
# 11 NaN 1.0
# 12 NaN 2.0
# 13 NaN 3.0
# 14 NaN 4.0
# 15 NaN 5.0
# 16 NaN 6.0
# 17 NaN 7.0
# 18 NaN 8.0
# 19 NaN 9.0
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过重置 df2 的索引来得到我想要的结果,但我想知道是否有更快的(也许是 numpy 方法)来做到这一点?
np.column_stack绝对等同于 EdChum 的回答。
pd.DataFrame(
np.column_stack([df1,df2]),
columns=df1.columns.append(df2.columns)
)
0 0
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
Run Code Online (Sandbox Code Playgroud)
assign您可以使用新列做很多事情。
我不推荐这个!
df1.assign(**df2.add_suffix('_').to_dict('l'))
0 0_
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
Run Code Online (Sandbox Code Playgroud)
纯 numpy 方法是使用np.hstack:
In[33]:
np.hstack([df1,df2])
Out[33]:
array([[0, 0],
[1, 1],
[2, 2],
[3, 3],
[4, 4],
[5, 5],
[6, 6],
[7, 7],
[8, 8],
[9, 9]], dtype=int64)
Run Code Online (Sandbox Code Playgroud)
通过将其作为数据参数传递给 ctor,可以轻松地将其转换为 df DataFrame:
In[34]:
pd.DataFrame(np.hstack([df1,df2]))
Out[34]:
0 1
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
Run Code Online (Sandbox Code Playgroud)
关于数据是否连续,各个列将被视为单独的数组,因为它本质上是一个字典Series,当您传递 numpy 数组时,这里不需要分配内存和复制来实现简单且同构的数据类型,因此应该快点。