【问题标题】:Conditionally replacing values based on values in another column根据另一列中的值有条件地替换值
【发布时间】:2012-11-06 21:54:30
【问题描述】:

我有一个非常大的数据框(~1.7MM 行 x 6 列)。相关数据的简化示例是:

City        Borough

Brooklyn    Brooklyn
Astoria     Queens
Astoria     Unspecified
Ridgewood   Unspecified
Ridgewood   Queens

因此,我尝试根据“城市”列中的信息填充“未指定”值。例如,City Ridgewood 在一个实例中位于未指定的自治市镇,但在数据集中的其他地方正确地将自治市镇列为皇后区。

我已经探索过 Panda 的 fillna,但它似乎不能满足我的需求。我也考虑过 np.where 方法,但我不确定它在这种情况下是如何工作的。我对 Pandas 很陌生,但也许地图/应用功能是我需要的?这可能可以通过一千种不同的方式来完成,但要寻找一些考虑到数据大小不会爬网的东西。

编辑:我能够使用以下代码创建一个字典,其中包含城市和行政区之间出现次数最多的“对”:

specified = data[['Borough','City']][data['Borough']!= 'Unspecified']
paired = specified.Borough.groupby(specified.City).max()
paired = paired.to_dict()

配对的字典以城市为键,以自治市镇为值。现在最后一步是将其应用/映射回自治市镇列...我该怎么做?

【问题讨论】:

  • 替换后,是否需要这些重复值?也就是说,您是否要以两个相同的行结束,上面写着“Astoria”/“Queens”?或者您可以删除未指定值的那些吗?
  • 是的,重复是可以的,也是预期的。

标签: python pandas


【解决方案1】:

这是一种方法:

>>> d
         City      Borough
0   Brooklyn     Brooklyn
1    Astoria       Queens
2    Astoria  Unspecified
3  Ridgewood  Unspecified
4  Ridgewood       Queens
>>> realData = d[d.Borough != "Unspecified"]
>>> realData = pandas.Series(data=realData.Borough.values, index=realData.City)
>>> d['Borough'] = d.City.map(realData)
>>> d
         City   Borough
0   Brooklyn  Brooklyn
1    Astoria    Queens
2    Astoria    Queens
3  Ridgewood    Queens
4  Ridgewood    Queens

这假设每个城市都只有一个未指定的自治市镇值。 (如果城市没有价值但未指定,则自治市镇将显示为 NA。)

编辑:如果您已经在编辑后的帖子中创建了字典,只需使用d['Borough'] = d.City.map(paired['Borough']) 将每个城市从您的字典映射到自治市镇。 map 是一个有用的了解方法。它可以使用 Pandas 系列、dict 或返回给定键的映射值的函数来映射值。

【讨论】:

  • 在某些情况下,同一个城市可能与不同的自治市镇配对,例如,97% 的城市“纽约”被映射到曼哈顿自治市镇,但地图如何处理这种情况情况?
  • @ChrisArmstrong:如果一个城市出现多个不同的行政区,这将不起作用。但是在这种情况下你想发生什么?你想怎么选?
  • @ChrisArmstrong:查看我编辑的答案。您可以使用data.City.map(paired) 获取新的行政区。
  • 呃,似乎指定的代码。Borough.groupby(specified.City).max() 没有产生预期的结果...试图弄清楚如何纠正
  • @ChrisArmstrong:是的,这确实是一个单独的问题。一旦你有了那个dict,不管你怎么得到它,你都可以使用我展示的方法。但是你需要明确定义如何选择。如果一个城市同样频繁地映射到两个行政区会怎样?
猜你喜欢
  • 2019-02-03
  • 2021-10-01
  • 2020-05-20
  • 1970-01-01
  • 2019-02-12
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多