有没有办法在忽略索引的同时水平连接相同长度的数据帧?

时间:2018-05-09 09:43:39

标签: pandas dataframe

我想要在忽略索引时水平连接数据帧。

我知道对于算术运算,如果使用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方法)来做到这一点?

2 个答案:

答案 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

的Pandas选项

你可以用新栏目做很多事情 我不推荐这个!

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,它应该很快。