注意:这个问题确实是Split pandas dataframe string entry to separate rows的重复,但这里提供的答案更通用,信息量更大,所以尊重所有,我选择不删除帖子 < / p>
我有一个'数据集',格式如下:
id | value | ...
--------|-------|------
a | 156 | ...
b,c | 457 | ...
e,g,f,h | 346 | ...
... | ... | ...
我希望通过复制每个ID的所有值来规范化它:
id | value | ...
--------|-------|------
a | 156 | ...
b | 457 | ...
c | 457 | ...
e | 346 | ...
g | 346 | ...
f | 346 | ...
h | 346 | ...
... | ... | ...
我正在做的是使用pandas
使用.groupby
的split-apply-combine原则,为每个组创建tuple
(groupby value, pd.DataFrame())
我创建了一个分组的列,它只计算行中的ID:
df['count_ids'] = df['id'].str.split(',').apply(lambda x: len(x))
id | value | count_ids
--------|-------|------
a | 156 | 1
b,c | 457 | 2
e,g,f,h | 346 | 4
... | ... | ...
我复制行的方式如下:
pd.DataFrame().append([group]*count_ids)
我正在慢慢前进,但它确实非常复杂,我很感激你可以分享这类问题的最佳做法或建议。
答案 0 :(得分:6)
试试这个:
In [44]: df
Out[44]:
id value
0 a 156
1 b,c 457
2 e,g,f,h 346
In [45]: (df['id'].str.split(',', expand=True)
....: .stack()
....: .reset_index(level=0)
....: .set_index('level_0')
....: .rename(columns={0:'id'})
....: .join(df.drop('id',1), how='left')
....: )
Out[45]:
id value
0 a 156
1 b 457
1 c 457
2 e 346
2 g 346
2 f 346
2 h 346
说明:
In [48]: df['id'].str.split(',', expand=True).stack()
Out[48]:
0 0 a
1 0 b
1 c
2 0 e
1 g
2 f
3 h
dtype: object
In [49]: df['id'].str.split(',', expand=True).stack().reset_index(level=0)
Out[49]:
level_0 0
0 0 a
0 1 b
1 1 c
0 2 e
1 2 g
2 2 f
3 2 h
In [50]: df['id'].str.split(',', expand=True).stack().reset_index(level=0).set_index('level_0')
Out[50]:
0
level_0
0 a
1 b
1 c
2 e
2 g
2 f
2 h
In [51]: df['id'].str.split(',', expand=True).stack().reset_index(level=0).set_index('level_0').rename(columns={0:'id'})
Out[51]:
id
level_0
0 a
1 b
1 c
2 e
2 g
2 f
2 h
In [52]: df.drop('id',1)
Out[52]:
value
0 156
1 457
2 346