[英]How to group and aggregate data using pandas/Python only if a specific condition/calculation is met?
有一个 pandas.DataFrame df
看起来像这样:
City Country Latitude Longitude Population ...
Berlin Germany 52.516602 13.304105 118704
Berlin Germany 52.430884 13.192662 292000
...
Berlin USA 39.7742446 -75.0013423 7588
Berlin USA 43.9727912 -88.9858084 5524
我想按列City
和Country
对数据进行分组并总结他们的人口:
grouped_data = df.groupby([df['City'], df['Country'])['Population'].agg('sum').reset_index()
但为了处理歧义——美国的两个条目不会合并——我的想法是计算并检查每个潜在groupby()
结果的纬度/经度之间的距离。
假设有一个距离 function 以公里为单位返回两个地理点的距离,我想按城市和国家对所有条目进行分组,并仅当distance()
的结果小于 50 公里时才总结它们的人口。
上述示例的 output 可能如下所示:
City Country Latitude Longitude Population
Berlin Germany [52.516602, 52.430884] [13.304105, 13.192662] 410704
...
Berlin USA 39.7742446 -75.0013423 7588
Berlin USA 43.9727912 -88.9858084 5524
知道如何在 pandas 中解决这个问题吗? 我很高兴你的建议。
您所要求的是一个网络问题,如果两个节点的距离小于 50 公里,则它们会被连接。 这样做时,您可以创建一个距离矩阵并使用networkx
构建图形。 沿着这条线的东西:
from sklearn.metrics.pairwise import haversine_distances as haversine
# calculate haversine
dist_mat = haversine(np.deg2rad(df[['Latitude','Longitude']]) ) * 6371 # earth's radius
adjacency = dist_mat < 50
import networkx as nx
G = nx.from_numpy_matrix(adjacency)
components = nx.connected_components(G)
然后你可以对这些components
进行分组
另一方面,您可能更容易允许在这些 bin 上合并 Lat/Long 和 groupby。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.