2017-02-14 60 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()