Lor*_*rai 5 python pandas split-apply-combine
注意:这个问题的确是一个重复的分离pandas数据帧字符串条目到单独的行,但这里提供的答案更通用和信息丰富,所以在所有方面到期,我选择不删除线程
我有一个'数据集',格式如下:
id | value | ...
--------|-------|------
a | 156 | ...
b,c | 457 | ...
e,g,f,h | 346 | ...
... | ... | ...
Run Code Online (Sandbox Code Playgroud)
我想通过复制每个ID的所有值来规范化它:
id | value | ...
--------|-------|------
a | 156 | ...
b | 457 | ...
c | 457 | ...
e | 346 | ...
g | 346 | ...
f | 346 | ...
h | 346 | ...
... | ... | ...
Run Code Online (Sandbox Code Playgroud)
我正在做的是应用split-apply-combine pandas使用原则,为每个组.groupby创建一个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
... | ... | ...
Run Code Online (Sandbox Code Playgroud)
我复制行的方式如下:
pd.DataFrame().append([group]*count_ids)
Run Code Online (Sandbox Code Playgroud)
我正在慢慢地进步,但它确实很复杂,我很感激您可以与这类问题分享的任何最佳实践或建议.
试试这个:
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
Run Code Online (Sandbox Code Playgroud)
说明:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |