如何在数据帧中将列分成多行?

问题描述 投票:1回答:4

我有如下的数据帧

A B C D E F G H G H  I  J  K
1 2 3 4 5 6 7 8 9 10 11 12 13

我想要这样的结果

A B C D E F G H 
1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 9
1 2 3 4 5 6 7 10
1 2 3 4 5 6 7 11
1 2 3 4 5 6 7 12
1 2 3 4 5 6 7 13

像结果列'G~K'在列'H'下

我怎样才能做到这一点?

python pandas
4个回答
2
投票

你需要使用cummax调整你的列,然后在melt之后,我们用cumcount创建额外的键,然后在这里重塑,我使用unstack,你可以使用pivotpivot_table

s=pd.Series(df.columns)
s[(s>='H').cummax()==1]='H'
df.columns=s
df=df.melt()

yourdf=df.set_index(['variable',df.groupby('variable').cumcount()]).\
          value.unstack(0).ffill()
yourdf
variable    A    B    C    D    E    F    G     H
0         1.0  2.0  3.0  4.0  5.0  6.0  7.0   8.0
1         1.0  2.0  3.0  4.0  5.0  6.0  7.0   9.0
2         1.0  2.0  3.0  4.0  5.0  6.0  7.0  10.0
3         1.0  2.0  3.0  4.0  5.0  6.0  7.0  11.0
4         1.0  2.0  3.0  4.0  5.0  6.0  7.0  12.0
5         1.0  2.0  3.0  4.0  5.0  6.0  7.0  13.0

0
投票

我希望这会给你一些帮助

import pandas as pd

df = pd.DataFrame([list(range(1,14))])
df.columns = ('A','B','C','D','E','F','G','H','G','H','I','J','K')

print('starting data frame:')
print(df)


df1 = df.iloc[:,0:7]
df1 = df1.append([df1]*(len(df.iloc[:,7:].T)-1))
df1.insert(df1.shape[1],'H',list(df.iloc[:,7:].values[0]))

print('result:')
print(df1)

0
投票
letters = list("ABCDEFGHIJKLM")
df = pd.DataFrame([np.arange(1, len(letters) + 1)], columns=letters)
df = pd.concat([df.iloc[:, :7]] * (len(letters) - 7)).assign(H=df[letters[7:]].values[0])
df = df.reset_index(drop=True)
df

给你

    A   B   C   D   E   F   G   H
0   1   2   3   4   5   6   7   8
1   1   2   3   4   5   6   7   9
2   1   2   3   4   5   6   7   10
3   1   2   3   4   5   6   7   11
4   1   2   3   4   5   6   7   12
5   1   2   3   4   5   6   7   13

0
投票

您的数据在列名称中有一些重复,因此melt将失败。但是,您可以更改列名称,然后应用melt

In [166]: df
Out[166]:
   A  B  C  D  E  F  G  H  G   H   I   J   K
0  1  2  3  4  5  6  7  8  9  10  11  12  13

列名“G”和“H”重复。只需将它们改为'GG','HH'即可。最后,申请melt

In [167]: df.columns = ('A','B','C','D','E','F','G','H','GG','HH','I','J','K')

In [168]: df
Out[168]:
   A  B  C  D  E  F  G  H  GG  HH   I   J   K
0  1  2  3  4  5  6  7  8   9  10  11  12  13

In [169]: df.melt(id_vars=df.columns.tolist()[0:7], value_name='H').drop('variable', 1)
Out[169]:
   A  B  C  D  E  F  G   H
0  1  2  3  4  5  6  7   8
1  1  2  3  4  5  6  7   9
2  1  2  3  4  5  6  7  10
3  1  2  3  4  5  6  7  11
4  1  2  3  4  5  6  7  12
5  1  2  3  4  5  6  7  13
© www.soinside.com 2019 - 2024. All rights reserved.