【问题标题】:how to filter a particular column with python pandas?如何使用 python pandas 过滤特定列?
【发布时间】:2022-01-26 08:14:54
【问题描述】:

我有一个 excel 文件,其中有 2 列:“名称”和“大小”。 'Name' 列有多种文件类型,即".apk, .dat, .vdex, .ttc" 等。但我只想填充以.apk 结尾的文件扩展名的文件。我不希望新的 Excel 文件中有任何其他文件类型。

我写了以下代码:

import pandas as pd
import json

def json_to_excel():
    with open('installed-files.json') as jf:
        data = json.load(jf)
        df = pd.DataFrame(data)
        new_df = df[df.columns.difference(['SHA256'])]
        new_xl = new_df.to_excel('abc.xlsx')
        return new_xl

def filter_apk():  `MODIFIED CODE`
    old_xl = json_to_excel()
    data = pd.read_excel(old_xl)
    a = data[data["Name"].str.contains("\.apk")]
    a.to_excel('zybg.xlsx')

以上程序执行以下操作:

  • json_to_excel(),获取一个 Json 文件,将其转换为 .xlsx 格式并保存。

  • filter_apk() 假设根据“名称”列中存在的文件扩展名创建多个 excel 文件。

  1. 第一个函数正在做我打算做的事情。
  2. 第二个函数没有做任何事情。它也不会抛出任何错误。我关注了这个weblink

以下是“名称”列的几个示例

/system/product/<Path_to>/abc.apk
/system/fonts/wwwr.ttc
/system/framework/framework.jar
/system/<Path_to>/icu.dat
/system/<Path_to>/Normal.apk
/system/<Path_to>/Tv.apk

如何让它发挥作用?还是有更好的方法来实现目标?

请提出建议。

错误

    raise ValueError(msg)
ValueError: Invalid file path or buffer object type: <class 'NoneType'>

注意:

我将所有文件都放在同一个位置。

修改代码:

import pandas as pd
import json

def json_to_excel():
    with open('installed-files.json') as jf:
        data = json.load(jf)
        df = pd.DataFrame(data)
        new_df = df[df.columns.difference(['SHA256'])]
        new_df.to_excel('abc.xlsx')

def filter_apk():
    json_to_excel()
    old_xl = pd.read_excel('abc.xlsx')
    data = pd.read_excel(old_xl)
    a = data[data["Name"].str.contains("\.apk")]
    a.to_excel('zybg.xlsx')


t = filter_apk()
print(t)

新错误:

Traceback (most recent call last):
  File "C:/Users/amitesh.sahay/PycharmProjects/work_allocation/TASKS/Jenkins.py", line 89, in <module>
    t = filter_apk()
  File "C:/Users/amitesh.sahay/PycharmProjects/work_allocation/TASKS/Jenkins.py", line 84, in filter_apk
    data = pd.read_excel(old_xl)
  File "C:\Users\amitesh.sahay\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\util\_decorators.py", line 296, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\amitesh.sahay\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\io\excel\_base.py", line 304, in read_excel
    io = ExcelFile(io, engine=engine)
  File "C:\Users\amitesh.sahay\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\io\excel\_base.py", line 867, in __init__
    self._reader = self._engines[engine](self._io)
  File "C:\Users\amitesh.sahay\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\io\excel\_xlrd.py", line 22, in __init__
    super().__init__(filepath_or_buffer)
  File "C:\Users\amitesh.sahay\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\io\excel\_base.py", line 344, in __init__
    filepath_or_buffer, _, _, _ = get_filepath_or_buffer(filepath_or_buffer)
  File "C:\Users\amitesh.sahay\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\io\common.py", line 243, in get_filepath_or_buffer
    raise ValueError(msg)
ValueError: Invalid file path or buffer object type: <class 'pandas.core.frame.DataFrame'>

【问题讨论】:

  • 为什么要先将JSON转换成excel文件?你不能直接从'installed-files.json' 开始吗?
  • 我这样做是因为有一个进程正在生成一个包含所有详细信息的 Json 文件。因此,作为报告的自动化过程,我必须首先将 Json 转换为 excel,然后第二个函数旨在处理特定列“名称”
  • 问题是你要给新的excel文件起的名字其实是一个路径,所以python/pandas认为你想在/system/product/&lt;Path_to&gt;/中保存一个名为abc.apk.xlsx的文件,所以它将其保存在那里,如果该路径不存在,则会出错。
  • 好的,那么有什么解决方案可以达到目的吗?

标签: python-3.x pandas dataframe


【解决方案1】:

您的用例与weblink 中显示的用例之间存在差异。您想应用单个过滤器(apk 文件),而您看到的示例有多个过滤器,这些过滤器将一个接一个地应用(多个物种)。

这样就可以了。

def filter_apk():
    old_xl = json_to_excel()
    data = pd.read_excel(old_xl)
    a = data[data["Name"].str.contains("\.apk")]
    a.to_excel("<path_to_new_excel>\\new_excel_name.xlsx")

【讨论】:

  • Kunal ,我尝试实施您的建议。但我收到错误。添加在主帖中,包括修改后的代码。
  • 错误可能来自 json_to_excel 函数。 Pandas documentation 建议 to_excel 方法不会返回任何内容。当您在该函数中返回变量 new_xl 时,请尝试返回 excel 文件的路径(包括文件名)。
【解决方案2】:

关于您更新的新问题。我猜你的第一个函数没有像你想象的那样工作。

new_xl = new_df.to_excel('abc.xlsx')

这将编写一个 excel 文件,正如您所期望的那样。哪个有效。

但是,将它分配给new_xl,并没有做任何事情,因为pd.to_excel 没有返回。因此,当您将new_xl 作为json_to_excel 函数的输出返回时,您实际上返回了None。因此,在您的第二个函数中,old_xl = json_to_excel() 将使 old_xl 具有值 None

所以,你的函数应该是这样的:

def json_to_excel():
    with open('installed-files.json') as jf:
        data = json.load(jf)
        df = pd.DataFrame(data)
        new_df = df[df.columns.difference(['SHA256'])]
        new_df.to_excel('abc.xlsx')

def filter_apk(): 
    json_to_excel()
    data= pd.read_excel('abc.xlsx')
    a = data[data["Name"].str.contains("\.apk")]
    a.to_excel('zybg.xlsx')

【讨论】:

  • 保罗,谢谢您的回复。我已按照您的建议修改了程序。但我仍然得到错误。在主帖中添加新程序和错误。可以的话请看一下。
  • 做了一些测试,我删除了“data = pd.read_excel(old_xl)”这一行。这摆脱了错误。但现在我得到“无”作为输出
  • 通过删除“data = pd.read_excel(old_xl)”行来解决问题。 “无”问题是由于我尝试调用该函数的方式造成的。而不是将函数分配给变量。我只调用了函数。谢谢
  • 对不起,我的错,不小心打了两次read_excel,在我的回答中也修复了它。如果我的回答解决了您的问题,请投票并接受作为答案,让其他用户知道这有效。
猜你喜欢
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2022-07-05
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2018-12-27
相关资源
最近更新 更多