ValueError:需要多于1个值才能解压缩,如何让我的代码更健壮?

时间:2016-03-23 20:36:01

标签: python python-2.7 pandas

我已经让这个脚本在过去2或3个月内运行得很好,然后由于什么原因我不知道它只是决定它会破坏我。我还没有更新Python或我在这个脚本中使用的任何库,但无论如何,现在我需要帮助修复它。

启动数据帧如下

$scope.makeCall= function () { //<-- removed $http dependency from here
   console.log("HERE");
   $http({ method: 'GET', url: 'url' })
      .then(function (response) {
            console.log(response.data);
            return response.data;
      }, function (response) {

      }
   );
};

我通过将所有列转换为小写并使用&#39; _&#39;替换空格来清理这些列。

下一步是拆分&#34; contact_name&#34;列开始为&#34;(第一个)(最后)&#34;即&#34; John Doe&#34;我想为第一个和最后一个添加2列。新DF如下,

Company, Registered date, Contact name, Contact email, Contact phone

该程序打破了联系人姓名的分割和/或新列的创建。我用来执行此操作的代码行是:

company, registered_date, contact_name, first_name, last_name, contact_email, contact_phone

追溯说:

df1['first_name'], df1['last_name'] = zip(*df1['registrant_name'].apply(lambda x: x.split(' ', 1)))

当我查看一些东西时,我发现有人在使用line.split时遇到同样的问题(不是在Pandas内部,一般只是python)而且有人说它可能是因为这两个值都不存在。果然,似乎这是我在3个月内第一次以某种方式结束了&#34; contact_name&#34;专栏而不是&#34; John Doe&#34;只是&#34; John&#34; (幸运的是,这实际上是这个CSV中的第一个条目,否则我会被困在一段时间试图浏览每一行)。

所以我的问题是,如何让我的代码更加健壮,以便如果再次出现这个问题,我们就可以解决它。我想我要做的是,如果没有空间,它只会将当前值作为&#34; first_name&#34;然后添加&#34; NaN&#34;作为姓氏。我只是不知道如何在DF内完成它,因为循环并不理想。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

也许在 str.partition 中使用 itemgetter

import pandas as pd


df = pd.DataFrame(["foo bar" , "foo", "bar barf"],columns=["name"])
from operator import itemgetter


df['first_name'], df['last_name'] = zip(*df['name'].apply(lambda x: itemgetter(0,2)(x.partition(' '))))

那会给你一个空字符串,用于遗漏姓氏,所以我不确定这是否合适。

        name first_name last_name
0   foo bar        foo       bar
1       foo        foo          
2  bar barf        bar      barf

不确定这是否会更快但是它避免了lambda:

import pandas as pd

df = pd.DataFrame(["foo bar" , "foo", "bar barf"],columns=["name"])
from operator import itemgetter


df['first_name'], df['last_name'] = zip(*map(itemgetter(0, 2), df['name'].str.partition(" ").values))
print(df)

答案 1 :(得分:1)

您正在寻找的是从[{1}} ['John', 'Doe']'John Doe' ['John', '']返回'John'的方法。这样,您将始终有两个值来解压缩。

肯定有不同的解决方案,但我可以提出一个避免循环的解决方案:

x.split(' ', 1) if ' ' in x else [x, '']

将其插入lambda函数应避免遇到错误。请注意,首先去除空格很重要,因为它们会使测试无效:

df1['registrant_name'].str.strip().apply(lambda x: x.split(' ', 1) if ' ' in x else [x, ''])