【问题标题】:Pandas Dataframe str.split error wrong number of items passed [duplicate]Pandas Dataframe str.split错误传递的项目数错误[重复]
【发布时间】:2020-08-01 16:16:09
【问题描述】:

遇到特定的 str.split 错误问题

我的数据框包含一个数字后跟文本:

(名字是编造的

    print(df)
Date         Entry
20/2/2019  6 John Smith
20/2/2019  8 Matt Princess
21/2/2019  4 Nick Dromos
21/2/2019  4 Adam Force
21/2/2019  5 Gary
21/2/2019  4 El Chaparro
21/2/2019  7 Mike O Malley
21/2/2019  8 Jason
22/2/2019  7 Mitchell

我只是想在数字后面将条目列一分为二。

我尝试过的代码:

df['number','name'] = df['Entry'].str.split('([0-9])',n=1,expand=True)

ValueError: 传递的项目数错误 3,位置暗示 1

然后我单独尝试了空间:

df['number','name'] = df['Entry'].str.split(" ",n=1,expand=True)

ValueError: 传递的项目数错误 2,位置暗示 1

理想情况下,df 看起来像:

  print(df)
    Date       number        name
    20/2/2019  6             John Smith
    20/2/2019  8             Matt Princess
    21/2/2019  4             Nick Dromos
    21/2/2019  4             Adam Force
    21/2/2019  5             Gary
    21/2/2019  4             El Chaparro
    21/2/2019  7             Mike O Malley
    21/2/2019  8             Jason
    22/2/2019  7             Mitchell

我觉得它可能很小,但我似乎无法让它工作。任何帮助都会很棒!非常感谢

【问题讨论】:

  • 主要问题只是How to add multiple columns to pandas dataframe in one assignment?。你左边的df['number','name'] = ...没有意义,应该是df[['number','name']] = ...
  • 一个更具描述性的标题将是“如何使用 str.split 和 regex 将 pandas 字符串列转换为多个新列”。您从str.split 收到的实际错误消息信息量不是很大。另外,当您的意思是“熊猫数据框”时,不要说“Python 数据框”。

标签: python pandas


【解决方案1】:

添加双倍[],如果要从原始列中删除也添加DataFrame.pop,最后通过drop 删除第一个空列,[0-9]+ 更改为获取长度更像1 的数字,例如10567...:

df[['number','name']] = df.pop('Entry').str.split('([0-9]+)',n=1,expand=True).drop(0, axis=1)
print (df)
        Date number            name
0  20/2/2019      6      John Smith
1  20/2/2019      8   Matt Princess
2  21/2/2019      4     Nick Dromos
3  21/2/2019      4      Adam Force
4  21/2/2019      5            Gary
5  21/2/2019      4     El Chaparro
6  21/2/2019      7   Mike O Malley
7  21/2/2019      8           Jason
8  22/2/2019      7        Mitchell

Series.str.extract 的解决方案:

df[['number','name']] = df.pop('Entry').str.extract('([0-9]+)(.*)')
#alternative
#df[['number','name']] = df.pop('Entry').str.extract('(\d+)(.*)')
print (df)
        Date number            name
0  20/2/2019      6      John Smith
1  20/2/2019      8   Matt Princess
2  21/2/2019      4     Nick Dromos
3  21/2/2019      4      Adam Force
4  21/2/2019      5            Gary
5  21/2/2019      4     El Chaparro
6  21/2/2019      7   Mike O Malley
7  21/2/2019      8           Jason
8  22/2/2019      7        Mitchell

pop 函数用于避免在选择后删除列,因此此代码的工作方式相同:

df[['number','name']] = df.pop('Entry').str.extract('(\d+)(.*)')

df[['number','name']] = df['Entry'].str.extract('(\d+)(.*)')
df = df.drop('Entry', axis=1)

【讨论】:

  • 谢谢@jezrael。自从你帮助我解决我的另一个问题以来,我一直在尝试流行音乐。目前我收到“re.error:位置 1 的未终止字符集”
  • @SOK - 什么解决方案失败了?第一还是第二?顺便说一句,pop 只是 shourcut,给他们一秒钟的选择
  • 对不起,我没有看到更新。我跑了df[['number','name']] = df.pop('Entry').str.split('([0-9]+)',n=1,expand=True).drop(0, axis=1),它成功了,非常感谢(再次哈哈)
猜你喜欢
  • 2016-04-09
  • 2021-09-25
  • 2021-08-10
  • 2019-08-09
  • 2020-07-02
  • 2021-07-13
  • 2020-04-22
  • 2018-07-27
  • 1970-01-01
相关资源
最近更新 更多