有条件地在中创建行

2024-04-20 04:46:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 数据id字母条目条件逗号
2条回答

选项1
np.repeatpd.Series.str.count
它的工作方式是,我要重复字符串开头的值,重复次数等于找到的逗号数加1。对于第二列,我用逗号连接字符串,然后用逗号分隔整个字符串。你知道吗

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
使用理解
我觉得这更直观。它本质上是一个包含在理解中的产品或双for循环。你知道吗

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

您可以首先^{}-为2列数据帧,然后^{}Series,按,拆分并按^{}重塑。最后通过^{}进行一些数据清理:

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']

或者,可以使用^{}^{}进行展平:

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

相关问题 更多 >