我在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功能。我该怎么办?
答案 0 :(得分:1)
使用groupby
+ cumcount
创建pd.MultiIndex
。使用新column
和pd.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