qq_34423459 2022-03-19 06:04 采纳率: 100%
浏览 68
已结题

用python实现,找出两张表格中指定列中的差异值,并按照表3的格式输出,输出时以SID列前六位码进行分类输出,自动生成六位码命名的文件夹

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

两张表格以sid列关联后,逐列进行数据比对,发现不一致的数据按照表格3格式输出,并对表格3的sid列前6位码进行分类输出,自动生成六位码命名的文件夹

img

img

img

问题相关代码,请勿粘贴截图

import pandas as pd
df1=pd.read_excel('test.xlsx', sheet_name='内网平台').set_index('sID')
df1.sort_index()
df2=pd.read_excel('test.xlsx', sheet_name='ihaps').set_index('sID')
df_ihaps = df2.groupby(df2.index)[df2.columns[2:4201]].sum()
df_plat=df1.sort_index()
a=df_plat.columns
b=df_ihaps.columns
c=[i for i in b if not i in a]
ihaps=df_ihaps.drop(c,axis=1)
plat=df_plat
for i in ihaps.columns:
df=pd.concat([plat[i],ihaps[i]],axis=1)
df.columns=['old_'+i,'new_'+i]
df['diff']=df[df.columns[0]]-df[df.columns[1]]
df=df[~(df['diff']==0)]
if len(df)==0:continue
df.to_csv(i+'.csv')

运行结果及报错内容

1、输出的表格数据一样,但是相减之后得到一个不为0的值,能否规避这些?(如图)

img


2、代码执行后,输出许多csv文件,能否在输出的时候以sID列分类输出,以df的sID列的前六位数字自动生成文件夹,把这些csv文件分类放入相应的文件夹呢?

img

img

我的解答思路和尝试过的方法
我想要达到的结果

1、把结果输出到不同的文件夹中,文件夹名称和表内sid列前六位码一致。

img

img


2、解决数据相同,计算结果却不为0的问题,把计算结果为0的都不输出。

img


谢谢

展开全部

  • 写回答

1条回答 默认 最新

  • ash062 2022-03-19 14:59
    关注

    说个思路
    1、数据相同,相减结果不为零,看结果的数据形式,可考虑添加判断,若diff绝对值小于一小值则不输出

    df=df[~(abs(df['diff'])<1e-9)]
    

    2、根据6位数字保存至相应文件夹,只需取出该6位数字,判断当前是否存在该文件夹,不存在则新建一个,相应修改保存路径

    1. import os
    2. dirname = i[2:8] # i为循环的文件名
    3. if not os.path.exists(dirname):
    4. os.mkdir(dirname)
    5. ...
    6. df.to_csv('dirname\\' + i + '.csv')
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    qq_34423459 2022-03-20 03:00

    专家您好,第一个问题解决的非常好,第二个问题是这段代码我改如何嵌套呢?我的代码如下:

    import pandas as pd
    import os
    df1=pd.read_excel('test.xlsx', sheet_name='内网平台').set_index('sID')
    df1.sort_index()
    df2=pd.read_excel('test.xlsx', sheet_name='ihaps').set_index('sID')
    df_ihaps = df2.groupby(df2.index)[df2.columns[2:4201]].sum()
    df_plat=df1.sort_index()
    a=df_plat.columns
    b=df_ihaps.columns
    c=[i for i in b if not i in a]
    ihaps=df_ihaps.drop(c,axis=1)
    plat=df_plat
    for i in ihaps.columns:
        df=pd.concat([plat[i],ihaps[i]],axis=1)
        df.columns=['old_'+i,'new_'+i]
        df['diff']=df[df.columns[0]]-df[df.columns[1]]
        df=df[~(abs(df['diff'])<1e-9)]
        if len(df)==0:continue
        df.to_csv(i+'.csv')
    
    

    回复
    ash062 回复 qq_34423459 2022-03-20 06:01

    大概是这样

    import pandas as pd
    import os
    df1=pd.read_excel('test.xlsx', sheet_name='内网平台').set_index('sID')
    df1.sort_index()
    df2=pd.read_excel('test.xlsx', sheet_name='ihaps').set_index('sID')
    df_ihaps = df2.groupby(df2.index)[df2.columns[2:4201]].sum()
    df_plat=df1.sort_index()
    a=df_plat.columns
    b=df_ihaps.columns
    c=[i for i in b if not i in a]
    ihaps=df_ihaps.drop(c,axis=1)
    plat=df_plat
    for i in ihaps.columns:
        df=pd.concat([plat[i],ihaps[i]],axis=1)
        df.columns=['old_'+i,'new_'+i]
        df['diff']=df[df.columns[0]]-df[df.columns[1]]
        df=df[~(abs(df['diff'])<1e-9)]
        if len(df)==0:continue
        # 这部分处理按sID前六位分文件夹保存
        sID_set = set(i[:6] for i in df['sID'])  # 按sID前6位将其制成一个集合
        for j in sID_set:
            df_tmp = df[df['sID'][:6] == j]      # 筛选数据中sID前6位相同的所有行组成新的数据
            if not os.path.exists(j):            # 检查是否存在相应文件夹,不存在则创建一个
                os.mkdir(j)
            df_tmp.to_csv(f'{j}\\{i}.csv')       # 保存相应数据
    

    1
    回复
    qq_34423459 回复 ash062 2022-03-20 06:54

    专家您好,非常感谢您的热心帮助,代码在执行后出现了以下错误,还请您帮帮忙解答下
    KeyError Traceback (most recent call last)
    E:\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
    2896 try:
    -> 2897 return self._engine.get_loc(key)
    2898 except KeyError:

    pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

    pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

    pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

    pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

    KeyError: 'sID'

    During handling of the above exception, another exception occurred:

    KeyError Traceback (most recent call last)
    in
    18 if len(df)==0:continue
    19 # 这部分处理按sID前六位分文件夹保存
    ---> 20 sID_set = set(i[:6] for i in df['sID']) # 按sID前6位将其制成一个集合
    21 for j in sID_set:
    22 df_tmp = df[df['sID'][:6] == j] # 筛选数据中sID前6位相同的所有行组成新的数据

    E:\Anaconda3\lib\site-packages\pandas\core\frame.py in getitem(self, key)
    2978 if self.columns.nlevels > 1:
    2979 return self._getitem_multilevel(key)
    -> 2980 indexer = self.columns.get_loc(key)
    2981 if is_integer(indexer):
    2982 indexer = [indexer]

    E:\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
    2897 return self._engine.get_loc(key)
    2898 except KeyError:
    -> 2899 return self._engine.get_loc(self._maybe_cast_indexer(key))
    2900 indexer = self.get_indexer([key], method=method, tolerance=tolerance)
    2901 if indexer.ndim > 1 or indexer.size > 1:

    pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

    pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

    pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

    pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

    KeyError: 'sID'

    回复
    展开全部15条评论
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月27日
  • 已采纳回答 3月20日
  • 创建了问题 3月19日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部