将列拆分为多列

时间:2021-03-16 10:45:37

标签: python pandas

我有一个包含一列的数据框。我想把它分成多列

106
B-PER
I-PER
I-PER
B-PER
I-PER
I-PER
I-PER
B-PER
B-PROPH
109
B-PER
B-PER
I-PER
B-PER
I-PER
B-PER
I-PER
B-PER
I-PER
B-PROPH
116
B-PER
I-PER
I-PER
B-PER
B-PER
B-PER
B-PER

当整数值出现时,我想将此列拆分为多列。我知道我必须遍历行,但我不知道如何拆分它。所需的输出是:

106          109           116                          
B-PER        B-PER         B-PER
I-PER        B-PER         I-PER
I-PER        I-PER         I-PER
B-PER        B-PER         B-PER
I-PER        I-PER         B-PER
I-PER        B-PER         B-PER
I-PER        I-PER         B-PER
B-PER        B-PER
B-PROPH      I=PER
             PROPH

3 个答案:

答案 0 :(得分:2)

使用:

#test numeric values
m = df.A.astype(str).str.isnumeric()
#repeat only numeric values to groups
df['g'] = df.A.where(m).ffill()
#filter out rows without numeric (because repeated)
df = df[~m]
#reshape
df1 = df.set_index([df.groupby('g').cumcount(), 'g'])['A'].unstack(fill_value='')

print (df1)

g      106      109    116
0    B-PER    B-PER  B-PER
1    I-PER    B-PER  I-PER
2    I-PER    I-PER  I-PER
3    B-PER    B-PER  B-PER
4    I-PER    I-PER  B-PER
5    I-PER    B-PER  B-PER
6    I-PER    I-PER  B-PER
7    B-PER    B-PER       
8  B-PROPH    I-PER       
9           B-PROPH   

答案 1 :(得分:1)

以下是使用 pivot_table 的一种方法,假设您的列名为 'col'

g = df.col.str.isnumeric().cumsum()
out = df.pivot_table(df, 
                   columns=g, 
                   index=g.reset_index().groupby('col').cumcount(), 
                   aggfunc='first', 
                   fill_value='')
out.columns = out.loc[0]
out.drop(0)

0       106      109    116
1     B-PER    B-PER  B-PER
2     I-PER    B-PER  I-PER
3     I-PER    I-PER  I-PER
4     B-PER    B-PER  B-PER
5     I-PER    I-PER  B-PER
6     I-PER    B-PER  B-PER
7     I-PER    I-PER  B-PER
8     B-PER    B-PER       
9   B-PROPH    I-PER       
10           B-PROPH       

答案 2 :(得分:1)

首先使用 key

创建一个 cumcount() 列和一个新索引

最后,我们可以使用 unstack

我们使用 iloc[1:] 从第一行中删除列名。

df['key'] = pd.to_numeric(df[0],errors='coerce').ffill()
df1 = df.set_index([df.groupby('key').cumcount(),'key']).unstack(1).iloc[1:].droplevel(0,1)

key    106.0    109.0  116.0
1      B-PER    B-PER  B-PER
2      I-PER    B-PER  I-PER
3      I-PER    I-PER  I-PER
4      B-PER    B-PER  B-PER
5      I-PER    I-PER  B-PER
6      I-PER    B-PER   B-PE
7      I-PER    I-PER    NaN
8      B-PER    B-PER    NaN
9    B-PROPH    I-PER    NaN
10       NaN  B-PROPH    NaN