我想要在忽略索引时水平连接数据帧。
我知道对于算术运算,如果使用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
我知道我可以通过重置df2的索引来获得我想要的结果,但我想知道是否有更快(也许是numpy方法)来做到这一点?
答案 0 :(得分:3)
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
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
答案 1 :(得分:2)
纯粹的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)
通过将此数据作为arg传递给DataFrame
ctor,可以很容易地将其转换为df:
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
关于数据是否是连续的,单个列将被视为单独的数组,因为它本质上是Series
的字典,因为你传递的是numpy数组,没有内存分配和复制需要这里对于简单而均匀的dtype,它应该很快。