【问题标题】:Clean up excel data with python using pandas packagepython 使用pandas包清理excel数据
【发布时间】:2017-07-03 05:41:15
【问题描述】:

我已经使用 pd.read_excel 将 xls 文件读入 Python 中并使用 pandas

我正在尝试清理我的数据,但我已经超出了我的范围。

每条记录之间都有一个空行。在示例图片中,它是 excel 第 4、9 和 11 行。

有一个 cmets 列,在示例(参见链接)中指定为“col_F”。每条记录至少有一个包含文本的单元格。创建此 xls 文件的人将较长的 cmets 拆分为多个单元格。

我想将 col_F 中特定记录的所有数据连接到一个单元格中。

一旦我弄清楚如何正确连接 col_F,我也会删除空白记录。

我正在使用 Python 3.5.0、numpy 1.12.0 和 pandas 0.19.2

这是我目前所拥有的:

import numpy as np
import pandas as pd

data = pd.read_excel("C:/blah/blahblah/file.xls", header=0, nrows=10000)
df = pd.DataFrame(data)

感谢任何建议或见解!

谢谢!

原始数据的外观:

更新: 这是我加载到 Python 时数据的样子

这就是我想要的结果:

【问题讨论】:

  • 提示您或寻求答案:加载您的 df,用 np.nan、dropna('all'axis=1)、ffill()、groupby(col A 到 E) 替换空白。 (lambda x: '\n'.join(x)).reset_index()
  • 能否在此处附上或提供下载 Excel 表格的链接?
  • 我已经更新了我的问题,试图减少我最初问题的一些歧义。

标签: python python-3.x pandas numpy


【解决方案1】:

这是我在@Boud 在评论中解释的地方写的非常粗略的解决方案。我先在这里创建示例数据:

df = pd.DataFrame([
    ['record1', '10', 'date1', 'optional', 'comment'], 
    ['', '', '', '', 'comment continued'], 
    ['', '', '', '', ''], 
    ['record2', '100', 'date2', '', 'comment'], 
    ['', '', '', '', 'comment continued'], 
    ['', '', '', '', 'comment continued'], 
    ['', '', '', '', 'comment continued'], 
    ['', '', '', '', ''],
    ['record3', '10000', 'date3', '', 'comment']], 
    columns=['col_A', 'col_B', 'col_C', 'col_D', 'col_F'])
df.replace('', np.nan, regex=True, inplace=True)

注意这里的空格应该用NaN而不是空格来填充。基本上,首先,您可以使用 dropna 删除不使用的行。

df.dropna(axis=0, how='all', inplace=True) # drop NaN by row

然后你可以用以前的记录填写col_A

new_col = []
row_name = ''
for r in df.col_A:
    if not pd.isnull(r):
        row_name = r
    new_col.append(row_name)
df.col_A = new_col

在than之后,您可以通过将groupby函数应用于A列来对其他列进行分组,并通过如下连接字符串来聚合其他列。

gr = df.groupby('col_A')

def join_str(x):
    x = list(map(str, x))
    x = [e for e in x if str(e) != 'nan']
    return ' '.join(x)

gr.agg({'col_B' : join_str, 
        'col_C': join_str, 
        'col_D': join_str, 
        'col_F': join_str}).reset_index()

【讨论】:

    【解决方案2】:

    想通了!!! 向诺福克数据科学俱乐部大声疾呼,寻求帮助。

    导入 pandas、sqlite 和 os 包

    import pandas as pd
    import sqlite3
    import os
    

    指定文件路径和文件名

    filepath = "C:/blah/blahblah/randomfolder"
    filename = "raw_data.xlsx"
    filePathFileName = filepath + "/" + filename
    outputPathFileName = filepath + "/cleaned_" + filename
    outputFileName = "cleaned_" + filename
    

    使用 pandas 读取 excel 文件。

    df = pd.read_excel(filePathFileName, header=0, nrows=14)
    

    删除空白行

    df.dropna(how='all', inplace=True)
    

    填补我们数据中的空白

    df.ffill(inplace=True)
    

    创建一个 sqlite 数据库和一个到 sqlite 数据库的连接

    con = sqlite3.connect(":memory:")
    con.isolation_level = None
    cur = con.cursor()
    

    在 sqlite 中为我们的数据创建一个表

    df.to_sql('example_data', con)
    

    用于聚合数据的 SQL 查询

    df_pdsql = pd.read_sql_query("SELECT col_A, col_B, col_C, col_D, col_E, GROUP_CONCAT(col_F, ' ') AS col_F FROM example_data GROUP BY col_A", con)
    

    将我们的df写入xlsx文件

    df_pdsql.to_excel(outputPathFileName, sheet_name='test', index=False)
    

    让用户知道文件的位置

    print("Your new file is located in: " + outputPathFileName)
    

    关闭与 sqlite 数据库的连接

    con.close()
    

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 1970-01-01
      • 2021-07-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多