A
0 a-7,5,1,6,63,101,39,1
1 c-2,7,10,12,27,40,71,78
我的数据框与上面的数据框非常相似。
每行-
前面的字母代表一个id
每个逗号分隔值表示数据帧中的条目。
我如何有条件地格式化这一行,以便最终得到类似的内容:
id A
0 a 7
0 a 5
0 a 1
0 a 6
0 a 63
0 a 10
1 c 2
1 c 10
1 c 12
1 c 27
1 c 40
答案 0 :(得分:1)
您可以-
先Series
获取2列DataFrame,然后split
获取,
,按df = (df['A'].str.split('-', expand=True)
.set_index(0)[1]
.str.split(',', expand=True)
.unstack()
.sort_index(level=1)
.reset_index(level=0, name='a')
.reset_index(drop=True))
df.columns = ['id','A']
拆分并重塑set_index
。最后一些数据清理unstack
:
df = df['A'].str.split('-', expand=True)
a = df[1].str.split(',')
df = pd.DataFrame({'id': np.repeat(df[0].values, a.str.len()),
'A' : np.concatenate(a)}, columns=['id','A'])
print (df)
id A
0 a 7
1 a 5
2 a 1
3 a 6
4 a 63
5 a 101
6 a 39
7 a 1
8 c 2
9 c 7
10 c 10
11 c 12
12 c 27
13 c 40
14 c 71
15 c 78
或者,您可以reset_index
使用np.repeat
进行展平:
to_char
答案 1 :(得分:1)
选项1
使用np.repeat
和pd.Series.str.count
这样做的方式是我将重复字符串开头的值,其次数等于我找到的逗号数加一。对于第二列,我用逗号连接字符串,然后用逗号分隔整个事物。
s = df.A.str.split('-', 1)
pd.DataFrame(dict(
id=np.repeat(
s.str[0].values,
s.str[1].str.count(',') + 1
),
A=s.str[1].str.cat(sep=',').split(',')
))
A id
0 7 a
1 5 a
2 1 a
3 6 a
4 63 a
5 101 a
6 39 a
7 1 a
8 2 c
9 7 c
10 10 c
11 12 c
12 27 c
13 40 c
14 71 c
15 78 c
选项2
使用理解
这对我来说似乎更直观。它本质上是一个产品或双重包含在理解中的循环。
pd.DataFrame(
[(i, a) for i, b in (
x.split('-', 1) for x in df.A
) for a in b.split(',')],
columns=['id', 'A']
)
id A
0 a 7
1 a 5
2 a 1
3 a 6
4 a 63
5 a 101
6 a 39
7 a 1
8 c 2
9 c 7
10 c 10
11 c 12
12 c 27
13 c 40
14 c 71
15 c 78