Python-两个独立的条件取决于独立列的值(美国/加拿大邮政编码练习)

Python-两个独立的条件取决于独立列的值(美国/加拿大邮政编码练习),python,conditional-statements,data-cleaning,Python,Conditional Statements,Data Cleaning,我试图在我的数据集中创建一个新列,它依赖于我的数据中的两个独立列(国家和邮政编码)。如果国家是“USA”,我希望新列获取邮政编码列中的数据,并删除“-”(只保留前五个数字)后面的所有内容。如果国家是“加拿大”,我希望新列获取邮政编码列中的数据,删除所有空格并将数据输入新列。见下面的例子 我尝试过几种不同的方法,包括下面的方法,但没有一种有效 (1) df['new column']=[df['Zip Code'].str[:5]如果x=='USA',则df['Country']中的x为'no'

我试图在我的数据集中创建一个新列,它依赖于我的数据中的两个独立列(国家和邮政编码)。如果国家是“USA”,我希望新列获取邮政编码列中的数据,并删除“-”(只保留前五个数字)后面的所有内容。如果国家是“加拿大”,我希望新列获取邮政编码列中的数据,删除所有空格并将数据输入新列。见下面的例子

我尝试过几种不同的方法,包括下面的方法,但没有一种有效

(1) df['new column']=[df['Zip Code'].str[:5]如果x=='USA',则df['Country']中的x为'no'

(2) usa=df['Country'].str.contains('usa')


请帮助

您的第一次尝试非常接近-如果只有这两个国家,您可以使用if-else来相应地处理邮政编码。Pythons
zip()
-函数甚至允许您将所有内容都放在一个列表中理解,尽管这并不一定会产生最可读的代码

df['new column'] = [el[0][:5] if el[1] == 'USA' else el[0].replace(' ', '') for el in zip(df['Zip Code'], df['Country'])]
发生的事情并不太复杂:您检查国家代码是否为美国,如果是,只需取前5个字符,否则通过调用
string来删除空白。替换

为了达到与您提议的非常接近的效果,请使用以下方法:

df['new column'] = df['Zip Code'].str.replace(' ', '')
usa = df['Country'].str.contains('USA')
df['new column'][usa] = df['new column'][usa].str.slice(0,5)
第一行将邮政编码复制到新列,并一次性处理加拿大格式。由于USA行不包含空格,因此这只会影响加拿大行。然后,您只需找到USA行并根据自己的意愿将其切分

编辑: 由于有一些加拿大示例使用了破折号而不是空格,下面的代码块就是解决方法

df['new column'] = df['Zip Code'].str.replace(' ', '').str.replace('-', '')
usa = df['Country'].str.contains('USA')
df['new column'][usa] = df['new column'][usa].str.slice(0,5)

与Lukas Thaler的解决方案类似,只是做了一些调整。注意简单的正则表达式,以避免多个
replace
操作

将熊猫作为pd导入
df_1=pd.DataFrame(数据=zip(['USA','CANADA','CANADA'],['90210-5555','V5J 3L5','A1A-1A1']),列=['Country','zip'])
usa_mask=df_1[“国家”]=“美国”
加拿大面具=df_1[“国家”]=“加拿大”
df_1.loc[usa_mask',New Col']=df_1.loc[usa_mask',Zip'].str.slice(stop=5)
df_1.loc[canada_mask',New Col']=df_1.loc[canada_mask',Zip'].str.replace(“|-”,”)

如果您有任何问题,请告诉我:)

“但没有一个有效”您能详细说明吗?这很模糊。我不能同时执行这两个条件。我已经能够按照我的意图从美国邮政编码中分离出前5个数字,但是加拿大最终得到了所有空白的结果。sel是zip生成器返回的元素。它构建元组,其中第一个元素是邮政编码,第二个元素是国家名称:
Zip(df['Zip code'],df['country'])
为什么不使用
Zip
?这是Pythons在我看来最棒的功能之一。无论如何,我会想出一个没有zip的解决方案,将它编辑到我的原始帖子中,并通过一个无zip评论的方法通知你。结果比我预期的更整洁,并且是纯pandas.Series.str操作,因此它应该相当快,只需将另一个
.replace()
链接到相关元素,如
el[0]。替换(“”),.replace(“-”,“”)
如果可以使用Pandas方法轻松完成,那么最好不要使用列表理解。另外,我相信像
df['newcolumn'][usa]
这样的索引可以被
.loc[]
所取代。“df_1.loc”实际上是做什么的?@wolfblitza
loc
是使用标签或布尔数组进行索引的标准方法。第一个参数是行选择器,第二个参数是列选择器。您可以找到包含所有详细信息的文档。
df['new column'] = df['Zip Code'].str.replace(' ', '').str.replace('-', '')
usa = df['Country'].str.contains('USA')
df['new column'][usa] = df['new column'][usa].str.slice(0,5)