Python 使用列表创建新列

Python 使用列表创建新列,python,pandas,list,dataframe,list-comprehension,Python,Pandas,List,Dataframe,List Comprehension,我正在尝试创建一个包含城市名称的新列。我还有一个列表,其中包含所需的城市名称以及在不同列名下包含城市名称的CSV文件 我试图做的是检查列表中的城市名称是否存在于CSV文件的特定列中,并将该特定城市名称填入新列“城市” 我的代码是: 作为pd进口熊猫 将numpy作为np导入 城市名称列表=[‘阿姆斯特丹’、‘安特卫普’、‘布鲁塞尔’、‘根特’、‘阿什维尔’、‘奥斯汀’、‘波士顿’、‘布劳沃德县’, “剑桥”、“芝加哥”、“内华达州克拉克县”、“哥伦布”、“丹佛”、“夏威夷”、“泽西城”、“洛杉

我正在尝试创建一个包含城市名称的新列。我还有一个列表,其中包含所需的城市名称以及在不同列名下包含城市名称的CSV文件

我试图做的是检查列表中的城市名称是否存在于CSV文件的特定列中,并将该特定城市名称填入新列“城市”

我的代码是:


作为pd进口熊猫
将numpy作为np导入
城市名称列表=[‘阿姆斯特丹’、‘安特卫普’、‘布鲁塞尔’、‘根特’、‘阿什维尔’、‘奥斯汀’、‘波士顿’、‘布劳沃德县’,
“剑桥”、“芝加哥”、“内华达州克拉克县”、“哥伦布”、“丹佛”、“夏威夷”、“泽西城”、“洛杉矶”,
“纳什维尔”、“新奥尔良”、“纽约市”、“奥克兰”、“太平洋森林”、“波特兰”、“罗德岛”、“塞勒姆”或“圣地亚哥”]
数据={'host_identity_verified':['t','t','t','t','t','t','t','t','t','t','t'],
“邻居”:[“阿姆斯特丹,北荷兰,荷兰”,“阿姆斯特丹,北荷兰,荷兰”,“南”,
“阿姆斯特丹,北荷兰,荷兰”,“阿姆斯特丹,北荷兰,荷兰”,
“阿姆斯特丹,北荷兰,荷兰”,“阿姆斯特丹,北荷兰,荷兰”,“南”,
“阿姆斯特丹,北荷兰,荷兰”,“阿姆斯特丹,北荷兰,荷兰”],
“净化邻里关系”:[“Oostelijk Havengebied-Insche Buurt”,“Centrum Oost”,“Centrum West”,“Centrum West”,“Centrum West”,“Centrum West”,
“Oostelijk-Havengebied-Insche Buurt”、“Centrum-Oost”、“Centrum-West”、“Centrum-West”、“Centrum-West”、“Centrum-West”],
"清洁邻里":[南,"南","南","南","南","南","南","南",,
“纬度”:[52.36575,52.36509,52.37297,52.38761,52.36719,52.36575,52.36509,52.37297,52.38761,52.36719]]
df=pd.DataFrame(数据)
df['City']=[x代表城市名称列表中的x,如果df.loc[:,'host\u identity\u verified':'latitude'].values][0]
当我运行代码时,我收到以下消息:

回溯(最近一次呼叫最后一次):
文件“C:/Users/YAZAN/PycharmProjects/YAZAN_Work/try.py”,第63行,在
df['City']=[x代表城市名称列表中的x,如果df.loc[:,'host\u identity\u verified':'latitude'].values][0]
索引器:列表索引超出范围
这是因为面对阿姆斯特丹市的数据后面紧跟着其他词

我希望我的输出如下:

0阿姆斯特丹
1阿姆斯特丹
2阿姆斯特丹
3阿姆斯特丹
4阿姆斯特丹
5阿姆斯特丹
6阿姆斯特丹
7阿姆斯特丹
8阿姆斯特丹
9阿姆斯特丹
名称:城市,数据类型:对象

我坚持不懈地试图解决这个问题。我试图使用
endswith
startswith
,regex,但没有用。我可能两种方法都用错了。我希望有人能帮助我。

问题是,当你在df.loc[]中说
x时,你不是在检查城市名称是否在每个特定字符串中,而是检查城市名称是否在整个系列中,而事实并非如此。你需要的是这样的东西:

df['city'] = [x if x in City_Name_list else '' for x[0] in df['neighbourhood'].str.split(',')]
这将沿逗号拆分df['Neighbourt']中的每一行并返回第一个值,然后检查该值是否在城市名称列表中,如果是,则将其放入“城市”系列中。

使用
df['City'] = df['neighbourhood'].apply(lambda x: [i for i in x.split(',') if i in City_Name_List])
df['City'] = df['City'].apply(lambda x: "" if len(x) == 0 else x[0])
df['City']=df.apply(
lambda行:[x如果x在row.loc['neighbourth']中,表示x在城市名称列表中][0],
轴=1
)
执行上述操作后,
df['city']
将包含一个城市(通过将其包含在
city\u Name\u列表中定义),如果在每行的
'neighbource'
列中找到一个城市

改性溶液 您可以更明确地指定
City
应填充在每行
'neighbourth'
字段中
第一次出现之前的第一个子字符串上。如果
'neighbource'
列的结构可靠一致,这可能是一个好主意,因为它有助于缓解类似命名城市、城市名称列表中其他城市的子串城市产生的任何不必要行为

df['City']=df.apply(
lambda行:[x如果x在row.loc['neighbourth'].split(',')[0]表示x在城市名称列表中][0],
轴=1
)

注意:上述解决方案只是您如何解决所遇到问题的示例。它们没有考虑异常、边缘情况等的正确处理。一如既往,您应该注意在代码中考虑这些因素。

Apply比矢量化
系列慢。请提交一个矢量化答案:)谢谢您的回答。我部分地得到了我想要的,但是当原始列中有NaN值时,新列中的行变成空的。还有一件事,因为我正在处理2000多个CSV文件,而且并非所有文件都有名为Neighbour的列,但我知道城市名称位于host_identity_verified和latitude列之间,是否可以在代码中保留df.loc[:,'host_identity_verified':'latitude'][0]
在@LiamFiddler的回答中,有一个例子是pandas中的向量化str方法,您可能已经知道了。它删除至少一个应用或列表理解。我觉得他的用例要复杂得多,很难回答。我的索引器放错了位置,这导致了它的行为不正确,但总体解决方案是有效的。我在运行代码时遇到了这个错误:“值的长度”ValueError:值的长度(1)与索引的长度(10)不匹配噢,我很抱歉,我没有看到所有的数据,也没有意识到存在着NaN值。在这个列表理解中需要有一个else子句,这将导致数据帧中的每个值都没有一个city值,因此不同的长度会导致