我有一只DataFrame
熊猫:
import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df
Run Code Online (Sandbox Code Playgroud)
输出:
c1 c2
0 10 100
1 11 110
2 12 120
Run Code Online (Sandbox Code Playgroud)
现在我想迭代这个帧的行.对于每一行,我希望能够通过列的名称访问其元素(单元格中的值).例如:
for row in df.rows:
print row['c1'], row['c2']
Run Code Online (Sandbox Code Playgroud)
是否有可能在熊猫中做到这一点?
我发现了类似的问题.但它没有给我我需要的答案.例如,建议使用:
for date, row in df.T.iteritems():
Run Code Online (Sandbox Code Playgroud)
要么
for row in df.iterrows():
Run Code Online (Sandbox Code Playgroud)
但我不明白row
对象是什么以及如何使用它.
如何计算纬度和经度指定的两点之间的距离?
为了澄清,我想要以公里为单位的距离; 这些要点使用WGS84系统,我想了解可用方法的相对准确性.
使用的numpy的可以减去的形状(3)阵列的优良广播规则v
从一个形状(5,3)排列X
以
X - v
Run Code Online (Sandbox Code Playgroud)
结果是一个shape(5,3)数组,其中每一行i
都是差异X[i] - v
.
有没有办法减去形状(n,3)数组w
,X
以便从w
整个数组中减去每一行X
而不显式使用循环?
我在Python 2.7中的Pandas DataFrame中有以下内容:
Ser_Numb LAT LONG
1 74.166061 30.512811
2 72.249672 33.427724
3 67.499828 37.937264
4 84.253715 69.328767
5 72.104828 33.823462
6 63.989462 51.918173
7 80.209112 33.530778
8 68.954132 35.981256
9 83.378214 40.619652
10 68.778571 6.607066
Run Code Online (Sandbox Code Playgroud)
我想计算数据帧中连续行之间的距离.输出应该如下所示:
Ser_Numb LAT LONG Distance
1 74.166061 30.512811 0
2 72.249672 33.427724 d_between_Ser_Numb2 and Ser_Numb1
3 67.499828 37.937264 d_between_Ser_Numb3 and Ser_Numb2
4 84.253715 69.328767 d_between_Ser_Numb4 and Ser_Numb3
5 72.104828 33.823462 d_between_Ser_Numb5 and Ser_Numb4
6 63.989462 51.918173 d_between_Ser_Numb6 and Ser_Numb5
7 80.209112 33.530778 .
8 …
Run Code Online (Sandbox Code Playgroud) 我有一个包含纬度和经度的地方的数据框.想象一下,例如城市.
df = pd.DataFrame([{'city':"Berlin", 'lat':52.5243700, 'lng':13.4105300},
{'city':"Potsdam", 'lat':52.3988600, 'lng':13.0656600},
{'city':"Hamburg", 'lat':53.5753200, 'lng':10.0153400}]);
Run Code Online (Sandbox Code Playgroud)
现在我试图让所有城市都在另一个城市的半径范围内.假设距离柏林500公里,距汉堡500公里等所有城市.我会通过复制原始数据帧并使用距离函数连接来完成此操作.
中间结果有点像这样:
Berlin --> Potsdam
Berlin --> Hamburg
Potsdam --> Berlin
Potsdam --> Hamburg
Hamburg --> Potsdam
Hamburg --> Berlin
Run Code Online (Sandbox Code Playgroud)
分组(减少)后的最终结果应该是这样的.备注:如果值列表包含城市的所有列,那将会很酷.
Berlin --> [Potsdam, Hamburg]
Potsdam --> [Berlin, Hamburg]
Hamburg --> [Berlin, Potsdam]
Run Code Online (Sandbox Code Playgroud)
或者只是一个城市周围500公里的城市数量.
Berlin --> 2
Potsdam --> 2
Hamburg --> 2
Run Code Online (Sandbox Code Playgroud)
由于我对Python很陌生,所以我会很感激任何起点.我很熟悉长距离.但不确定Scipy或Pandas中是否有有用的距离/空间方法.
很高兴,如果你能给我一个起点.到目前为止,我尝试过这篇文章.
更新:这个问题背后的原始想法来自两西格玛连接租赁列表Kaggle比赛.我们的想法是让那些在另一个列表中上市100米.其中a)表示密度,因此表示热门区域; b)如果比较地址,您可以查看是否存在交叉,因此是否存在噪声区域.因此,您不需要完整的项目与项目关系,因为您不仅需要比较距离,还需要比较地址和其他元数据.PS:我没有向Kaggle上传解决方案.我只是想学习.
我想计算沿GPS坐标路径的距离,该坐标存储在数据帧的两列中.
import pandas as pd
df = pd.DataFrame({ 'lat' : [1, 2.5, 3, 1.2],
'lng' : [1, 1, 2.1, 1],
'label': ['foo', 'bar', 'zip', 'foo']})
print df
Run Code Online (Sandbox Code Playgroud)
产量
label lat lng
0 foo 1.0 1.0
1 bar 2.5 1.0
2 zip 3.0 2.1
3 foo 1.2 1.0
Run Code Online (Sandbox Code Playgroud)
GPS坐标以弧度存储.因此,数据帧的第一行和第二行之间的距离可以如下计算:
import math as m
r1 = 0
r2 = 1
distance =m.acos(m.sin(df.lat[r1]) * m.sin(df.lat[r2]) +
m.cos(df.lat[r1]) * m.cos(df.lat[r2]) * m.cos(df.lng[r2]-df.lng[r1]))*6371
Run Code Online (Sandbox Code Playgroud)
我想在每对连续行之间重复此计算,然后将每个短距离添加到完整路径的较长最终距离.
我可以将它放入数据帧的n-1行的循环中,但有更多的pythonic方法吗?
示例CSV如下所示:
user_id lat lon
1 19.111841 72.910729
1 19.111342 72.908387
2 19.111542 72.907387
2 19.137815 72.914085
2 19.119677 72.905081
2 19.129677 72.905081
3 19.319677 72.905081
3 19.120217 72.907121
4 19.420217 72.807121
4 19.520217 73.307121
5 19.319677 72.905081
5 19.419677 72.805081
5 19.629677 72.705081
5 19.111860 72.911347
5 19.111860 72.931346
5 19.219677 72.605081
6 19.319677 72.805082
6 19.419677 72.905086
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用hasrsine进行距离计算(而且python也有hasrsine包):
def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in …
Run Code Online (Sandbox Code Playgroud)