有条不紊地在熊猫中创建行

时间:2018-01-16 07:57:05

标签: python pandas

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

2 个答案:

答案 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.repeatpd.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