python - Pandas 将逗号分隔的字符串列拆分为两个单独的列,并向下分解行

标签 python pandas split

我的 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

解释:

  1. 根据 set_indexUid 列创建索引和 splitDataFrame
  2. 按楼层和模除法在列中创建MultiIndex
  3. reshape stack
  4. add_suffix 更改列名
  5. 最后 reset_index用于从 index
  6. 中删除第一级 MultiIndex 和列

关于python - Pandas 将逗号分隔的字符串列拆分为两个单独的列,并向下分解行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49401941/

相关文章:

python - 这是作为元组值的 python switch 语句执行函数的 "pythonic"方法吗?

python - 使用 Python 与正在运行的控制台应用程序交互

python - 在 Python 字典中搜索匹配键

python - 如何将 Dataframe 转换为 Series?

python - python(transpose)中如何基于单列展开数据?

python - DataFrame Pandas 显示 NAN

linux - shell 脚本 : to print selected text in the string

java - 如何获取单个字符串中包含的变量名称及其值?

python - 使用scrapy的MySQL数据库错误

python - 如何在 Python 列表中去掉\n 并拆分它周围的值