【问题标题】:Extracting dataframe columns for mapped data为映射数据提取数据框列
【发布时间】:2019-08-22 09:13:22
【问题描述】:

背景: 带有映射的 Excel 工作表。一般外观如下:

                Req1     Req2     Req3 ..... Req10
                A  B     A  B     A  B       A   B
Id     Text      
1      abc         x     x                       x
2      def               x
3      ghi                  x
4      jkl                                       x
5      mno      x                     

编辑:Screenshot of Excel File

问题:如何只提取标有“x”的列?也就是说,不会考虑列 Req3。

挑战:列标题是原始 excel 中的合并单元格 - 与“文本”列的级别不同。

已经尝试过:研究 .groupby() 函数和 for 循环。但不确定如何继续使用任何一个选项(如果它们适用)。

IDEA:(更新)将文件拆分为两个单独的数据框(Text + Reqs)。删除导致标题放置差异的行。然后重新加入单独的数据帧----但是如何?

已经将整个 excel 文件转换为 .csv 并在 jupyternotebooks 代码中作为数据框打开。也可以提取单独的列,但由于列标题之间的差异,无法让“ReqN”成为数据框的一部分。

预期结果:Pandas 数据框包含“Text”列和“x”出现的“ReqN”列。 (对标记的是A还是B不感兴趣。)

下一步:(如果与上述解决方案相关)以某种方式将“Text”+对应的“ReqN”存储为 csv 文件。

python 和 pandas 的新手。非常感谢对代码的一些指导。在 SO 上找到了几个示例,但它们在某处或其他地方都达不到要求。

【问题讨论】:

  • 您能否准确地显示工作表在 Excel 中的样子,也许是图像? AB 等是否在单独的列中,而 Req1Req2 是否在一个大的合并单元格中?
  • @Tom,没错。设法在帖子中添加指向屏幕截图的链接。
  • 您能否也发布您尝试导入数据时得到的结果,即pd.read_csv() 或类似名称?
  • 并不是说有错误,我的意思是发帖,比如说,df.head(),这样更容易看到你在做什么。
  • @Tom,感谢您的参与。不幸的是,我无法在公共论坛上发布这些数据。然而,我设法为解决方案找到了一种不同的方法。回答如下。似乎至少现在可以完成这项工作:)

标签: python-3.x pandas dataframe artificial-intelligence


【解决方案1】:

最初我希望通过在将不必要的数据输入代码之前减少我的 .csv 文件的大小。但是对于我的文件,我发现内存或速度不会成为问题。而且由于预先切割的方法给了我太多错误,我尝试了另一种方法。

进一步解决了问题中描述的“想法”。发布代码,详细信息如下。这可能是一种更长的方法,但对于像我这样的新手来说,它解决了这项工作。

#IMPORTING NECESSARY LIBRARIES
import pandas as pd
import numpy as np
import xlrd
import csv
import openpyxl
from openpyxl import load_workbook 

#TO CONVERT EXCEL TO .CSV
def csv_from_excel():
    wb = xlrd.open_workbook(r"\...\Data Docs\DATA_FILE.xlsm")
    ws = wb.sheet_by_name('Index')
    csv_train_data_1 = open('csv_train_data_1.csv', 'w', encoding='utf8')
    wr = csv.writer(csv_train_data_1, quoting=csv.QUOTE_ALL)

    for rownum in range(ws.nrows):
        wr.writerow(ws.row_values(rownum))

    csv_train_data_1.close()

csv_from_excel()

#PLAN TO USE maxRows LATER
fileName = r"\...\Data Docs\DATA_FILE.xlsm"
wb2 = load_workbook(fileName)
ws4 = wb2["Index"]
maxRows = ws4.max_row
print(maxRows)

#CONVERTS CSV TO DATAFRAME
df = pd.read_csv("csv_train_data_1.csv") 

#CREATES NEW DF WITH UNNECESSARY ROWS REMOVED
df = pd.read_csv("csv_train_data_1.csv", header = 1)
df2 = df.drop([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

#CUTS, AND MERGES SECTIONS OF DATAFRAME TO WHAT I NEEDED
cols = [1]
useful_df_1 = df[df.columns[cols]]
useful_df_2 = df[df2.columns[25:73]] 
useful_df_3 = useful_df_1.join([useful_df_2])
useful_df = useful_df_3.drop([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

# RENAMING OF ONE COLUMN
result_new = useful_df.rename(columns={"Unnamed: 1": "Specification no."})

#REPLACES ALL NaN VALUES WITH EMPTY/BLANK STRING FOR CLEANER DATA
import numpy as np
result_clean= result_new.replace(np.nan, '', regex=True)
result_clean.head(maxRows)

最后

#TO EXPORT THE FILE AS .CSV TO LOCAL FOLDER
export_csv = result_clean.to_csv(r'\...\Data\export_dataframe.csv', index = None, header=True)

这是最终结果。 未命名 (n) 列是问题中示例数据中的 B 列。显然,带有标题的列包括A 列。

我拥有的数据非常大,有数百列和数百行。默认情况下,pandas 数据框在它显示的窗口中具有一组行和列的值。要更改这些值以适合您的数据集,可以使用以下代码:

import pandas as pd

def start():
    options = {
        'display': {
            'max_columns': None,
            'max_colwidth': 25,
            'expand_frame_repr': False,  # Don't wrap to multiple pages
            'max_rows': 85,
            'max_seq_items': 50,         # Max length of printed sequence
            'precision': 4,
            'show_dimensions': False
        },
        'mode': {
            'chained_assignment': None   # Controls SettingWithCopyWarning
        }
    }

    for category, option in options.items():
        for op, value in option.items():
            pd.set_option(f'{category}.{op}', value)  # Python 3.6+

if __name__ == '__main__':
    start()
    del start  # Clean up namespace in the interpreter

希望这可以帮助任何寻找解决方案的人。 这些数据不是我在公共论坛上发布的,因此我很抱歉无法分享更多细节。

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 2017-01-16
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多