【问题标题】:Generate new column in pandas dataframe based on conditional statement根据条件语句在熊猫数据框中生成新列
【发布时间】:2019-12-16 15:17:31
【问题描述】:

我有 2 个熊猫数据框。第一个包含站点的经纬度信息,只有 3 行:

    stat_id    stat_lon     stat_lat
0   db_695203   9.444328    54.787590
1   db_699007   9.438629    54.789577
2   db_695442   9.445865    54.786215

第二个包含列'Polygon'(匀称的多边形格式)并且有20行:

0     POLYGON ((9.444721146384639 54.78805404001241,...
1     POLYGON ((9.429828147969117 54.79003403977831,... 
2     POLYGON ((9.429153147576411 54.78516304109078,...
.......................................................
18    POLYGON ((9.417355147148637 54.79108504035977,...
19    POLYGON ((9.44272277037326 54.79218198146992, ...

我的目标是:

  1. 检查点(带有她的坐标的站)是否在多边形中(这个没问题)
  2. 计算一个多边形中的站数(这就是问题所在)

我该怎么办:

for j in range(len(piece_clean_data)): #it's a df which contains polygons
P = shapely.wkt.loads(piece_clean_data.iloc[j,87]) #i convert string to Polygon
for i in range(len(three_stations)): #df with 3 stations
    p1 = Point(three_stations.iloc[i,1], three_stations.iloc[i,2]) #station coordinates
    st = P.contains(p1) #the answer is "True/False" - here i check, whether the point is in polygon or not
    if st == 'True': #and here I don't have any idea.

所以,最后我想多写一列“多边形中的站点数”,例如:

    0     POLYGON ((9.444721146384639 54.78805404001241,...   0
    1     POLYGON ((9.429828147969117 54.79003403977831,...   0 
    2     POLYGON ((9.429153147576411 54.78516304109078,...   1

请问有什么想法吗?提前非常感谢!

【问题讨论】:

标签: python pandas polygon shapely


【解决方案1】:

首先定义一个函数,给定一行迭代站点列表并计算站点是否包含在多边形内。然后对多边形列表DataFrame的每一行应用这个函数。

def num_stations(polygon):
  """Count the number of stations that are within a given polygon."""
  num = 0
  for _, station in three_stations.iterrows():
    p = Point(station['stat_lon'], station['stat_lat'])
    if polygon.contains(p):
      num += 1
  return num

piece_clean_data['station_counts'] = piece_clean_data.apply(num_stations, axis='columns')

【讨论】:

  • 谢谢!我不确定我是否可以应用此功能,因为“piece_clean_data”中的多边形是字符串,应该先将它们从字符串转换为多边形。
  • 当您使用apply 时,pandas 简单地将每一行中的值传递给您正在应用的函数。所以在我上面的解决方案中,polygon 参数将是num_stations 中的一个字符串。您可以在对其进行一些操作之前以任何您想要的方式对其进行转换。
  • 成功了!非常感谢!我唯一需要修改的是“axis”参数——我不太明白为什么要删除它,但我只是删除了:)
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 2019-03-27
  • 2023-02-02
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多