使用pandas包用python清理excel数据

使用pandas包用python清理excel数据,python,python-3.x,pandas,numpy,Python,Python 3.x,Pandas,Numpy,我已经使用pd.read\u excel将一个xls文件读入了带有pandas的Python 我正试图清理我的数据,但我的能力远远不够 每个记录之间都有一个空行。在示例pic中,它是excel第4、9和11行 有一个comments列,在示例中(参见链接)指定为“col_F”。每个记录至少有一个包含文本的单元格。创建此xls文件的人将较长的注释拆分为多个单元格 我想将某个特定记录的所有列数据连接到一个单元格中 一旦我弄清楚如何正确地连接col\u F,我还将删除空白记录 我使用的是Python版

我已经使用pd.read\u excel将一个xls文件读入了带有pandas的Python

我正试图清理我的数据,但我的能力远远不够

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

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

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

一旦我弄清楚如何正确地连接col\u 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时数据的外观

这就是我期望的结果:

我在@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
然后您可以按以前的记录填写
列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
之后,您可以通过将
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()
算了吧!!! 向诺福克数据科学俱乐部大声呼救

导入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
使用熊猫读取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()
con.close()
在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 = sqlite3.connect(":memory:")
con.isolation_level = None
cur = con.cursor()
con.close()

给你的提示或有抱负的答案:加载你的df,用np.nan、dropna('all'axis=1)、ffill()、groupby(col A-to-E)、apply(lambda x:'\n'.join(x)).reset_index()替换空格。你也可以在这里附加或提供下载excel表的链接吗?我已经更新了我的问题,试图减少我最初问题的一些歧义。