Anes- 2023-01-28 16:38 采纳率: 50%
浏览 24
已结题

Pandas合并前缀类似的行

问题遇到的现象和发生背景

在进行网页路径分析时想要将一些第一列字符串类似(比如abcde与abcdf,abcd这个前缀相同)的行求和

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
import pandas as pd 
import numpy as np
df = pd.read_csv(r'C:\Users\Leo90\Downloads\data-export.csv',encoding='utf-8', header=None, sep='\n')
df = df[0].str.split(',', expand=True)
df=df.iloc[:,[0,1,2,3,4,5,6,7]]
df=df.replace(to_replace='None',value=np.nan).dropna()
df=df.reset_index(drop=True)
columnNames = df.iloc[0] 
df = df[1:] 
df.columns = columnNames
df.groupby('网页路径和屏幕类').head()

运行结果及详细报错内容

img

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

想要使用str.contain来合并相似列,但这样只能一种前缀合并一次且不知道该怎么求和(用SUM是不是可以呀)

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

有许多个类似前缀的列我想要将他们分组行求和,将这几千行数据转化为几十行合并后的数据

  • 写回答

2条回答 默认 最新

  • Dick_不周 2023-01-30 10:13
    关注

    新年好,这边梳理一下解决思路。望采纳
    1、数据 ---- 我们现在有几千条处理后的数据
    2、目标 : 根据第一列"最长前缀" 来进行合并,比如‘abcde’与‘abcdf’,abcd这个前缀相同。
    解决思路 :
    ① : 数据载入及处理(楼主已完成)
    ② : 将每一行第一列转为List1(简单)
    ③ : 对List1中各项进行最长前缀/最大相似值进行 计算 (疯狂),计算后的结果与原数据组合成List2[['列名','公共前缀'],...] (简单)
    ④ : 根据List2对应关系,原Dataframe增加对应列('公共前缀') (简单)
    ⑤ : 根据‘公共前缀列’ 进行 df.groupby() .agg(...) (简单 )

    所以难在第几步,难在第三步!
    要解决第三步,要规定好匹配/分类的规则,是'最长前缀'(即a、b两项都从首位开始匹配)
    还是 '最长公共值' (a,b两项任意匹配,如'kabcde' 和 ‘bcda’ 也能匹配出bcd)
    然后要解决的是如何分群(即我不能拿4000条数据去求最长前缀/公共值,我得分成几种/几十种来找各自的结果)

    这里首先给出最长前缀的代码

    class Solution(object):
        def longestCommonPrefix(self, strs):
            """
            :type strs: List[str]
            :rtype: str
            """
            res=""
            min_len=0
            if strs=="":
                return res
            ####遍历每个字符串求最小字符串长度
            for str in strs:
                if min_len==0:
                    min_len=len(str)
                elif min_len>len(str):
                    min_len=len(str)
            for str in strs:
                for str1 in strs :
                    if str!=str1 :
                        if str[0]==str1[0] :
                            pass 
                        else :
                            return ''
            for i in range(0,min_len):
                for str in strs:
                    for str1 in strs :
                        if str!=str1:
                            if str[:i]==str1[:i]:
                                pass
                            else :
                                return res
                    res=strs[0][0:i]
            return res
    

    分群的方法 :
    首先,无论如何分群,必定存在部分数据孤孤单单(一网址一类)
    数据量少的情况,可以按最终计算指标(查看次数/网页流量)倒序排列后对比前20?50 ? 浏览量大于1000? 的网址
    预设每个群体的结果,然后开始分群(代表性~) ,看最终适配数量(例如4000用户最终3500户在预设群体内)
    数据量爆炸的情况 : 需要更精细的分群方法,使结果趋向于最优/满足目标即可
    估计运算量极大,推荐预设分群结果值减少一定运算量。
    -------------------------敷衍的分割线-----------------------------

    我是很想上手操作一下的,这不是懒得自己造数据了嘛。
    如果有更好的解决办法,欢迎私信踢我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月7日
  • 已采纳回答 1月30日
  • 创建了问题 1月28日

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿