Pandas将逗号分隔的字符串拆分为2个单独的列并向下展开行

时间:2018-03-21 08:59:19

标签: python pandas numpy

我的数据目前采用此格式

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

我有一个问题,我需要将列表拆分为两列并采用字符串的以下序号位置(例如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个项目爆炸)

我试了一会儿,有人回答并给出了以下解决方案,这让我有了一些方法。现在越来越需要该数据采用上述格式。下面给我一些方法的代码。 (我正在使用此处描述的爆炸功能。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]

提前致谢。

1 个答案:

答案 0 :(得分: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

<强>解释

  1. set_indexsplitUid
  2. 从列DataFrame创建索引
  3. 逐层创建MultiIndex和模数除法
  4. 重塑stack
  5. add_suffix
  6. 更改列名称
  7. 上一次reset_index,用于移除MultiIndex的第一级和index
  8. 中的列