我有一个包含一列的数据框。我想把它分成多列
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
答案 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