我有my_dataframe
data | lat | lon |
------------+-----------------+--
10 | 1.0 | 3.0
11 | 2.0 | 4.0
21 | 9.0 | 3.0
我还有一个accepted_coordinates = [(1.0, 3.0), (2.0, 4.0)]
的列表。我需要从数据帧中删除经度/经度不在accepted_coordinates
中的所有行,因此最终的答案应该是一个数据帧,如下所示:
data | lat | lon |
------------+-----------------+--
10 | 1.0 | 3.0
11 | 2.0 | 4.0
我用groupby
和isin
尝试了一些东西,但不知道怎么做。
注意:如果两个坐标都在accepted_coordinates
中,但顺序错误,则应该删除该行。也就是说,如果有一行(1.0, 4.0)
的余弦
发布于 2019-11-08 12:37:27
我会将accepted_coordinates
转换为数据帧:
acc_coor = pd.DataFrame(accepted_coordinates, columns=['lat', 'lon'])
和带有my_dataframe
的merge
:
res = my_dataframe.merge(acc_coor, on=['lat', 'lon'], how='inner')
res
data lat lon
0 10 1.0 3.0
1 11 2.0 4.0
发布于 2019-11-08 12:34:17
此解决方案符合您帖子中的编辑。
import pandas as pd
df = pd.DataFrame(data=[(10, 1.0, 3.0), (11, 2.0, 4.0), (21, 9.0, 3.0)], columns=['data', 'lat', 'lon'])
valid_lat, valid_lon = zip(*[(1.0, 3.0), (2.0, 4.0)])
valid_lat = set(valid_lat)
valid_lon = set(valid_lon)
df = df[df['lat'].isin(valid_lat) & df['lon'].isin(valid_lon)]
发布于 2019-11-08 13:05:49
这可以通过以下方式实现:
def get_lat_lon(row):
# For creating new column
return (row['lat'], row['lon'])
df = pd.DataFrame(columns=['data', 'lat', 'lon'])
df['data'] = [10, 12, 15, 20]
df['lat'] = [1.0, 2.0, 9.0, 12.0]
df['lon'] = [3.0, 4.0, 3.0, 2.0]
accepted_coordinates = [(1.0, 3.0), (12.0, 2.0)]
df['lat_lon'] = df.apply(get_lat_lon, axis=1)
modified_df = df[df['lat_lon'].isin(accepted_coordinates)].drop(columns=['lat_lon'])
https://stackoverflow.com/questions/58760327
复制相似问题