我的 pandas 数据目前采用这种格式:
Uid Postcodelist
1 NE11 7HS,NE5 8MN,NE1 7UJ,NE14 8YU
2 LS6 8PJ
3 M6 7JH,M14 1HF
4 B17 8KA,LE5 7UZ,LE9 9GF
我遇到一个问题,我需要将 Postcodelist
列拆分为两列 P1, P2
并采用以下字符串的顺序位置。例如 Uid=1:
[1,2,3,4]
将拆分为:
[1],[2]
[3],[4]
这是我需要的预期输出:
Uid P1 P2
1 NE11 7HS NE5 8MN
1 NE1 7UJ NE14 8YU
2 LS6 8PJ Null
3 M6 7JH M14 1HF
4 B17 8KA LE5 7UZ
4 LE9 9GF Null
如果有超过 4 个项目,则需要进一步拆分和展开(我不认为会有定义的上限,但它需要为字符串列表中的每 2 个项目展开)。
我前段时间尝试过这个,有人回答并给出了以下解决方案,这让我取得了一些进展。现在越来越需要这种数据采用上述格式。下面是让我了解一些方法的代码。 (我正在使用此处描述的 explode()
函数。Split (explode) pandas dataframe string entry to separate rows
df[['P1','P2']] = df.pop('PreviousPostCodes').str.split(',\s*', n=1, expand=True)
df['P2'] = df['P2'].fillna('').str.split(',\s*', expand=False)
df = explode(df, lst_cols='P2')
这让我明白了(再次例如 uid=1)
[1,2,3,4]
转化为
[1],[2]
[1],[3]
[1],[4]
最佳答案
您可以使用:
df = df.set_index('Uid').pop('PreviousPostCodes').str.split(',\s*', expand=True)
df.columns = [df.columns % 2 + 1, df.columns // 2]
df = df.stack().add_prefix('P').reset_index(level=1, drop=True).reset_index()
print (df)
Uid P1 P2
0 1 NE11 7HS NE5 8MN
1 1 NE1 7UJ NE14 8YU
2 2 LS6 8PJ None
3 3 M6 7JH M14 1HF
4 4 B17 8KA LE5 7UZ
5 4 LE9 9GF None
解释:
- 根据
set_index
从Uid
列创建索引和split
到DataFrame
- 按楼层和模除法在列中创建
MultiIndex
- reshape
stack
- 按
add_suffix
更改列名 - 最后
reset_index
用于从index
中删除第一级
MultiIndex
和列
关于python - Pandas 将逗号分隔的字符串列拆分为两个单独的列,并向下分解行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49401941/