我有一个包含一列的数据框,其中包含纽约市的行政区名称(曼哈顿,布鲁克林等)。我想创建另一列“ borough_num”,为每个自治区分配一个数字(曼哈顿-> 1,布鲁克林-> 2,2,皇后区-> 3,史泰登岛-> 4,布朗克斯-> 5,5,其他-> 0) 。
但是,在“自治市镇”列中,某些行在自治市镇名称前包含数字(例如,我用“ 07 Bronx”代替“ Bronx”)。由于此“ 07 Bronx”仍然是Bronx自治市镇的一部分,因此也应将其分配为与“ Bronx”相同的值“ 5”。因此,我需要创建一个字典,将数字5分配给包含单词“ Bronx”的字符串。每个自治市镇都一样。关于如何执行此操作的任何线索?我是python新手!
这是我在用数字注意到单元格之前的内容:
df['Borough'] = df['Borough'].fillna('OTHER')
borough_dict = {'MANHATTAN':1, 'BROOKLYN':2, 'QUEENS': 3, 'STATEN ISLAND': 4, 'BRONX': 5, 'OTHER':6}
df['borough_num'] = df['Borough'].apply(lambda x:0 if borough_dict.get(x) == None else borough_dict.get(x))
最佳答案
由于有一小部分自治市名称要为其分配整数代码,因此将其作为一系列显式逻辑索引分配来进行处理是完全可以接受的,例如下面的一些示例数据。
具体而言,在这种情况下,无需尝试将自治市代码映射封装到DataFrame上的dict
或帮助函数或任何更高级的apply
或map
操作中。
一组5个无聊的直接逻辑分配。
In [13]: df = pandas.DataFrame({
'Borough': ["Manhattan", "Brooklyn", "Bronx", "07 Bronx",
"109 Staten Island", "03 Brooklyn", "04 Queens"],
'Value':[1, 2, 3, 4, 5, 6, 7]
})
In [14]: df
Out[14]:
Borough Value
0 Manhattan 1
1 Brooklyn 2
2 Bronx 3
3 07 Bronx 4
4 109 Staten Island 5
5 03 Brooklyn 6
6 04 Queens 7
In [15]: df['Borough_num'] = 6 # everything defaults to the 'other' case
In [16]: df.loc[df.Borough.str.contains("Manhattan"), 'Borough_num'] = 1
In [17]: df.loc[df.Borough.str.contains("Brooklyn"), 'Borough_num'] = 2
In [18]: df.loc[df.Borough.str.contains("Queens"), 'Borough_num'] = 3
In [19]: df.loc[df.Borough.str.contains("Staten Island"), 'Borough_num'] = 4
In [20]: df.loc[df.Borough.str.contains("Bronx"), 'Borough_num'] = 5
In [21]: df
Out[21]:
Borough Value Borough_num
0 Manhattan 1 1
1 Brooklyn 2 2
2 Bronx 3 5
3 07 Bronx 4 5
4 109 Staten Island 5 4
5 03 Brooklyn 6 2
6 04 Queens 7 3
如果出于任何原因要封装自治区到代码的映射,都可以使用简单的
dict
后跟循环来实现:In [30]: borough_code = {'Manhattan': 1, 'Brooklyn': 2, 'Queens': 3,
'Staten Island': 4, 'Bronx': 5}
In [31]: for borough, code in borough_code.items():
...: df.loc[df.Borough.str.contains(borough), 'Borough_num'] = code
除非DataFrame是巨大的,否则
str.contains
的重复矢量化计算与跨列映射函数是无法区分的,但将更容易理解。关于python - 用另一列中的子字符串创建字典键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49909176/