我已经让这个脚本在过去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内完成它,因为循环并不理想。
感谢您的帮助!
答案 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, ''])