注意:这个问题确实是Split pandas dataframe字符串条目复制到单独行的重复,但是此处提供的答案更通用,更有意义,因此,在所有方面,我选择不删除线程
我有一个具有以下格式的“数据集”:
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 | ... ... | ... | ...
我正在做的是应用split-apply-combine的pandas使用原理,为每个组.groupby创建一个tuple``(groupby value, pd.DataFrame())
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 ... | ... | ...
我复制行的方式如下:
pd.DataFrame().append([group]*count_ids)
我的进度很慢,但是确实很复杂,对于可以与此类问题分享的任何最佳实践或建议,我将不胜感激。
尝试这个:
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