当列名相同时,将列堆叠在另一个下面

时间:2017-03-23 21:12:10

标签: python python-2.7 pandas dataframe

我在pandas数据框中有一个庞大的数据集。它看起来像这样

df = pd.DataFrame([[1,2,3,4],[31,14,13,11],[115,613,1313,1]], columns=['c1','c1','c2','c2'])   

这里前两列有相同的名称。因此,它们应该连接成一个列,因此值是一个低于另一个。所以数据框应该是这样的:

df1 = pd.DataFrame([[1,3],[31,13],[115,1313],[2,4],[14,11],[613,1]], columns=['c1','c2']) 

注意:我的orignal数据帧有很多列,所以我不能使用简单的concat函数来堆叠列。我还尝试使用堆栈功能,除了concat功能。我该怎么办?

2 个答案:

答案 0 :(得分:1)

使用groupby + cumcount创建pd.MultiIndex。使用新columnpd.MultiIndex

重新分配stack
df = pd.DataFrame(
    [[1,2,3,4],[31,14,13,11],[115,613,1313,1]],
    columns=['c1','c1','c2','c2'])   


df1 = df.copy()
df1.columns = [df.columns, df.columns.to_series().groupby(level=0).cumcount()]
print(df1.stack().reset_index(drop=True))

    c1    c2
0    1     3
1    2     4
2   31    13
3   14    11
4  115  1313
5  613     1

或者用一点创意,一行

df.T.set_index(
    df.T.groupby([df.columns]).cumcount(),
    append=True
).unstack().T.reset_index(drop=True)

    c1    c2
0    1     3
1    2     4
2   31    13
3   14    11
4  115  1313
5  613     1

答案 1 :(得分:0)

您可以融合数据框,然后计算每列中的条目以用作新数据框的索引,然后将其重新堆叠回来:

import pandas as pd

df = pd.DataFrame(
    [[1,2,3,4],[31,14,13,11],[115,613,1313,1]],
    columns=['c1','c1','c2','c2']) 

df1 = (pd.melt(df,var_name='column')
         .assign(n = lambda x: x.groupby('column').cumcount())
         .set_index(['n','column'])
         .unstack())
df1.columns=df1.columns.get_level_values(1)
print(df1)

哪个产生

column   c1    c2
n                
0         1     3
1        31    13
2       115  1313
3         2     4
4        14    11
5       613     1