首页 > 解决方案 > 检测相似的行并为熊猫数据框中的每个相同元素组创建列表

问题描述

我有一个包含 3 列的主要熊猫数据框。页面路径,页面浏览量,页面日期。我想检测具有相同页面路径的元素,并为具有相同页面路径的每一行制作单独的熊猫数据框。 主数据框

会有很多组,但是在图像中,可以观察到 /news/AAL 和 /news/ZVO。但是,如果我们更详细地研究该列表,就会发现有很多组。我想不出一种方法来查找具有相同页面路径的行。

感谢您的帮助。

标签: pythonpandas

解决方案


你在正确的道路上。您只需要使用与过滤行相同的模式创建一个正则表达式捕获组(),但使用所需的组周围。使用str.extractwithexpand=False将第一个(也是唯一的)捕获组作为系列返回。然后,将此 Series 作为参数应用到groupby函数。此函数为这些组中的每一个返回单独的 pandas 数据帧,您可以通过 for 循环或使用groupByObj.get_group(groupName).

文件sample.csv用作输入

ga:pagePath, ga:pageviews, ga:pageDate
/news/AAL/1004553, 2958, 1612569600
/news/AAL/1004553, 9158, 1612569600
/news/BLX/2004553, 9258, 1612569600
...
...
/news/JKK/1005553, 4558, 1612569600
/news/ZZP/2034553, 7338, 1612569600
/news/ZZP/6004553, 9458, 1612569600
/news/ZZP/4004553, 8858, 1612569600
import pandas as pd

df = pd.read_csv("sample.csv")
print(df)

regex = r"^/news/([A-Z]{3})/.*"

groups = df["ga:pagePath"].str.extract(regex, expand=False)
page_groups = df.groupby(groups)

for groupName, dfGroup in page_groups:
    print(f"------- {groupName} -------")
    print(dfGroup)

page_groups的输出

------- AAL -------
         ga:pagePath   ga:pageviews   ga:pageDate
0  /news/AAL/1004553           2958    1612569600
1  /news/AAL/1004553           9158    1612569600
------- BLX -------
         ga:pagePath   ga:pageviews   ga:pageDate
2  /news/BLX/2004553           9258    1612569600
...
...
------- JKK -------
          ga:pagePath   ga:pageviews   ga:pageDate
13  /news/JKK/2009553           1458    1612569600
14  /news/JKK/1005553           4558    1612569600
------- ZZP -------
          ga:pagePath   ga:pageviews   ga:pageDate
15  /news/ZZP/2034553           7338    1612569600
16  /news/ZZP/6004553           9458    1612569600
17  /news/ZZP/4004553           8858    1612569600

推荐阅读