2017-02-14 9 views
3

を使ってPythonでExcelデータをクリーンアップ私はクリーンアップに私のデータをしようとしていますが、私は私のリーグから抜け出す方法です。私はpd.read_excel</p> <p>を使ってパンダとのPythonにXLSファイルを読んでいるパンダパッケージ

すべてのレコードの間に空白行があります。例の写真では、4行目、9行目、11行目が優れています。

この例では、コメント列があり、「col_F」と表示されています。すべてのレコードには、テキストを含む少なくとも1つのセルがあります。このxlsファイルを作成した人は、長いコメントを複数のセルに分割します。

特定のレコードのcol_F内のすべてのデータを1つのセルに連結したいと思います。

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

更新: what I would like dataframe to look like when finished

: 私は、Pythonにロード時にこれが私のデータがどのように見えるかです raw data read into python

これは私の望ましい結果は次のようになります。

+0

ヒント:.apply)(ffill、あなたのDFをロードnp.nan、dropna( 'すべて' 軸= 1)で空白を置き換える、GROUPBY(EへのCOL A)( reset_index() – Boud

+0

また、Excelシートをダウンロードするためのリンクを添付することもできますか? – titipata

+0

私は最初の質問のあいまいさを軽減するために質問を更新しました。 – Tommy

答えて

0

はそれを考え出しました! ノーフォーク・データ・サイエンス・クラブに救援のために大声で叫ぶ。

輸入パンダ、sqliteのとOSパッケージ

import pandas as pd 
import sqlite3 
import os 

Excelファイルを読み込むファイルパスとファイル名

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

使用パンダを指定します。

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

削除空白行我々のデータ内のギャップで

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

塗りつぶし

df.ffill(inplace=True) 

sqliteのデータベースと

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

が作成sqliteのデータベースへの接続を作成します表のfo R 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.to_sql('example_data', con) 

sqliteの

における我々のデータは、ファイルが

print("Your new file is located in: " + outputPathFileName) 
を置かれている場所のletユーザーが知っている

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

ファイルをXLSXために私たちのDFを書きます

sqliteへのクローズ接続データベースあなたや答えを志望ため

con.close() 
1

これは、私が@Boudがコメントで説明したところに書いた、本当に粗末な解決策です。私が最初にここでの例のデータを作成します。ここではブランクがNaNの代わりに、空白で満たされる必要があることを

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) 

は注意してください。基本的には、最初に使用しない行を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 

よりも後、することができます次のように文字列を結合することにより、カラムAと集計他人の列へgroupby機能を適用することにより、グループの他の列が。

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() 
関連する問題