Pandas:将多列合并为一列

28

我有以下数据(2列,4行):

Column 1: A, B, C, D

Column 2: E, F, G, H

我正在尝试将列合并为一个列,看起来像这样(1列,8行):

Column 3: A, B, C, D, E, F, G, H

我正在使用pandas DataFrame,并尝试使用不同的函数(如appendconcat等),但都没有成功。非常感谢您的帮助!

4个回答

41

关键在于使用stack()函数。

df.stack().reset_index()
    
   level_0   level_1  0
0        0  Column 1  A
1        0  Column 2  E
2        1  Column 1  B
3        1  Column 2  F
4        2  Column 1  C
5        2  Column 2  G
6        3  Column 1  D
7        3  Column 2  H

1
这个答案最右侧的值与OP所要求的列相比,顺序不正确,是吗? - Martin

17

更新

pandas内置了一个方法stack,它可以实现你想要的功能,请查看其他答案

这是我几年前在不知道stack之前的第一个答案:

In [227]:

df = pd.DataFrame({'Column 1':['A', 'B', 'C', 'D'],'Column 2':['E', 'F', 'G', 'H']})
df
Out[227]:
  Column 1 Column 2
0        A        E
1        B        F
2        C        G
3        D        H

[4 rows x 2 columns]

In [228]:

df['Column 1'].append(df['Column 2']).reset_index(drop=True)
Out[228]:
0    A
1    B
2    C
3    D
4    E
5    F
6    G
7    H
dtype: object

11
你可以使用 ravel 将列方向上的值展平,速度更快。
In [1238]: df
Out[1238]:
  Column 1 Column 2
0        A        E
1        B        F
2        C        G
3        D        H

In [1239]: pd.Series(df.values.ravel('F'))
Out[1239]:
0    A
1    B
2    C
3    D
4    E
5    F
6    G
7    H
dtype: object

细节

中等

In [1245]: df.shape
Out[1245]: (4000, 2)

In [1246]: %timeit pd.Series(df.values.ravel('F'))
10000 loops, best of 3: 86.2 µs per loop

In [1247]: %timeit df['Column 1'].append(df['Column 2']).reset_index(drop=True)
1000 loops, best of 3: 816 µs per loop

大型的

In [1249]: df.shape
Out[1249]: (40000, 2)

In [1250]: %timeit pd.Series(df.values.ravel('F'))
10000 loops, best of 3: 87.5 µs per loop

In [1251]: %timeit df['Column 1'].append(df['Column 2']).reset_index(drop=True)
100 loops, best of 3: 1.72 ms per loop

1
df.values正在转换为底层数组,并在其上调用numpy.ravel()。但是pandas提供了stack() - smci
1
推荐使用DataFrame.to_numpy()而不是DataFrame.values - Frank

4
你似乎是在寻求创建数据的另一个视图方面的帮助。如果没有特殊原因需要将这些数据分成两列,那么可以只创建一列来存储。但如果你需要将它们合并以便在其他工具中显示,可以尝试以下方法:
import itertools as it, pandas as pd
df = pd.DataFrame({1:['a','b','c','d'],2:['e','f','g','h']})
sorted(it.chain(*df.values))
# -> ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接