【问题标题】:Python Pandas: Create lists from a Dataframe that shows the indices of values that match criteriaPython Pandas:从数据框创建列表,显示符合条件的值的索引
【发布时间】:2020-08-14 15:03:03
【问题描述】:

抱歉,我是 python Pandas 的新手,因此我可能没有以正确的方式思考。

以下数据框显示了计算出的 2 个列表的每个值之间的距离。假设这两个列表包含 100 个值,那么 Dataframe 由计算出的 100*100 距离组成。

Dataframe 如下所示:

       Columns    Place A      ...               Place Z
   Rows                        ...                         
    Place 1       1203.899830  ...               612.069576
    39             496.571302  ...               173.808444
    46            1061.913143  ...               488.477587
    48             978.166934  ...               412.830790
    57            1008.997612  ...               595.226911
    ...                   ...  ...                      ...
    20675         1705.383726  ...              1233.132858
    20676         1562.641365  ...               962.671417
    20678          433.199056  ...               451.470780
    20679          112.586538  ...               720.512590
    Place 20680    53.794611  ...               681.927796
    
    [4068 rows x 179 columns]

我希望在 Place A 到 Z 下列出小于 100 公里的每个地点(1 到 20680)。因此,必须为每一列单独应用 100 公里过滤器。

例如,地点 1 距离地点 A 1200 公里,因此它不应出现在“地点 1”列中。 Place 39 距离 Place X 仅 30 公里,因此 Place 39 应该出现在“Place X”列中。

换句话说,

到目前为止,我只为一列完成了它,但我想为每一列都实现它:

Input:  Index_label = df_dist_matrix[df_dist_matrix['Place A']< 100].index.tolist()

print(Index_label)

Output:
[175, 252, 379, 398, 455, 486, 523,....., Place 20680]

非常感谢您的帮助,谢谢!

【问题讨论】:

  • 你的数据框在不同的列上不能有不一致的大小,所以你可能需要做的是用NaNs填充你想要删除的值
  • 其实很好,谢谢!我设法过滤了

标签: python pandas dataframe filter


【解决方案1】:

我跑了 200 公里,因为您的样本数据不那么具有代表性……然后您就有了每列的字典及其对应的索引值。

df = pd.read_csv(io.StringIO("""       Columns    Place A      ...               Place Z
   Rows                        ...                         
    Place 1       1203.899830  ...               612.069576
    39             496.571302  ...               173.808444
    46            1061.913143  ...               488.477587
    48             978.166934  ...               412.830790
    57            1008.997612  ...               595.226911
    ...                   ...  ...                      ...
    20675         1705.383726  ...              1233.132858
    20676         1562.641365  ...               962.671417
    20678          433.199056  ...               451.470780
    20679          112.586538  ...               720.512590
    Place 20680    53.794611  ...               681.927796"""), sep="\s\s+", engine="python")\
    .drop(columns="...").drop([0,6])

df = df.astype({c:"float64" for c in df.columns if "Place" in c})
{c:df[df[c].lt(200)].index.tolist() for c in df.columns if "Place" in c}

输出

{'Place A': [10, 11], 'Place Z': [2]}

【讨论】:

  • 这太棒了,真诚地感谢您!一件听起来有点愚蠢的小事。对于我发布的示例,我在列标题中添加了“地点”。在真实文件中没有“地点”标签,而是名称。考虑到我不知道你在做什么,你能帮我解决这个问题吗?或者以其他方式为我分解一点,让它更容易理解?无论如何,再次感谢!
  • 好的 - 所以我注意到有一个列 Columns,然后是一系列以 Place 开头的列。所以我决定我只想获取名称开始的列的索引 Place 因此if "Place" in c 以限制它正在处理的列。在 PyCon 2020 上有一个关于列表/字典理解的非常好的演讲。你可以在 YouTube 上找到它。该解决方案的核心是使用理解。 astype() 你不需要 - 那是我清理你的样本数据,以便它可以使用数字
  • 现在很有意义。谢谢!
猜你喜欢
  • 2018-03-03
  • 2021-05-27
  • 2016-12-25
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 2020-02-22
  • 2020-04-19
  • 2017-07-24
相关资源
最近更新 更多