2017-02-14 61 views
3

清理与Python的Excel数据我看过一个xls文件成Python使用pd.read_excel使用熊猫包

我想清理我的数据,但我的出路我联赛的大熊猫。

每条记录​​之间都有一条空白行。在这个例子中,它是excel第4,9和11行。

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

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

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

我使用Python版本3.5.0,numpy的1.12.0和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) 

我明白任何建议或见解!

谢谢!

如何将原始数据看起来: enter image description here

更新: 这是我的数据看起来如何,当我加载到Python的 raw data read into python

这是我想要的结果会是什么样子: what I would like dataframe to look like when finished

+0

提示您或有抱负的答案:加载DF,由np.nan更换空白,dropna( '所有' 轴= 1),ffill(),GROUPBY(COL A到E)。适用( lambda x:'\ n'.join(x))。reset_index() – Boud

+0

您还可以附加或提供链接以下载Excel表单吗? – titipata

+0

我已更新我的问题,尝试减少我最初的问题的一些含糊之处。 – Tommy

回答

0

想通了! 大呼救诺福克数据科学俱乐部的援助之手。

进口大熊猫,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() 

创建连接桌子[R我们在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() 
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 

比后,您可以将其他列由加盟字符串如下应用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()