【问题标题】:Geo Pandas Data Frame / Matrix - filter/drop NaN / False valuesGeopandas Dataframe / Matrix - 过滤/删除 NaN / Falsy 值
【发布时间】:2016-01-08 13:37:24
【问题描述】:

我将 GeoSeries.almost_equals(other[, decimal=6]) 函数应用于具有 1000 万个条目的地理数据框,以便找到彼此靠近的多个地理点。 :

这给了我矩阵,现在我需要过滤所有 True 值,以便创建只有与地理相关的 POI 的 DF/列表,所以我使用了:

现在,我很难弄清楚如何进一步使用这个矩阵的过滤器。 预期的输出是向量、列表或理想情况下的 DF,具有所有 TRUE(匹配)值但彼此匹配 re 1 到 1,并且重复(如果 [1,9] 则 [9,1] 从输出中删除 列表示例:

DF 示例:

【问题讨论】:

  • 你有没有尝试过?如果是这样,请发布您的代码。
  • 是的,我用过:data = df['geometry'].apply(lambda x: (df['geometry'].T.geom_almost_equals(x,decimal=6))),它给了我带有布尔值的矩阵
  • 你能具体说明你的问题是什么吗?从真假矩阵出发,你想得到什么结果?你能举例说明这应该是什么样子吗?
  • 从真/假矩阵开始,我想输出哪些组合是真的,所以ex。如果 row:200 并且 Col 420 和 500 都返回 True,则输出将是数据框或列表:200,420,500。等等
  • 你能举例说明它在 DataFrame 中的样子吗? (你现在给出的例子是列表)

标签: python-2.7 numpy matrix pandas geopandas


【解决方案1】:

考虑这个示例数据框:

In [1]: df = pd.DataFrame([[True, False, False, True],
   ...: [False, True, True, False],
   ...: [False, True, True, False],
   ...: [True, False, False, True]])

In [2]: df
Out[2]:
       0      1      2      3
0   True  False  False   True
1  False   True   True  False
2  False   True   True  False
3   True  False  False   True

获取匹配索引的数据框的可能解决方案:

首先我使用np.triu 只考虑上三角形(所以你没有重复):

In [15]: df2 = pd.DataFrame(np.triu(df))

In [16]: df2
Out[16]:
       0      1      2      3
0   True  False  False   True
1  False   True   True  False
2  False  False   True  False
3  False  False  False   True

然后我堆叠数据框,为索引级别指定所需的名称,并仅选择我们具有“真”值的行:

In [17]: result = df2.stack()

In [18]: result
Out[18]:
0  0     True
   1    False
   2    False
   3     True
1  0    False
   1     True
   2     True
   3    False
2  0    False
   1    False
   2     True
   3    False
3  0    False
   1    False
   2    False
   3     True
dtype: bool

In [21]: result.index.names = ['POI_id', 'matched_POI_ids']

In [23]: result[result].reset_index()
Out[23]:
   POI_id  matched_POI_ids     0
0       0                0  True
1       0                3  True
2       1                1  True
3       1                2  True
4       2                2  True
5       3                3  True

您当然可以删除具有 true 的列:.drop(0, axis=1)

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 2021-05-04
    • 1970-01-01
    • 2020-02-01
    • 2020-02-07
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多