2016-04-29 7 views
0

最終的なファイルにNaN行を入れてExcel用のforループで読み込み、すべての会社、電子メール、ファイナルはExcelファイルにロードされます。 Company複数を防止するためにglob/mergeを使用して、特定のExcelファイルの特定の列を削除します。

Company_x First Name Last Name Emails_x Created_x Hosted Meetings 03112016 Facilitated Meetings_x Attended Meetings_x Company_y Emails_y ... Created_x Hosted Meetings 04122016 Facilitated Meetings_x Attended Meetings_x Company_y Emails_y Created_y Hosted Meetings 04212016 Facilitated Meetings_y Attended Meetings_y 
0 TS X Y [email protected] 03/10/2016 0.0 0.0 0.0 TS [email protected] ... 03/10/2016 0.0 0.0 2.0 NaN NaN NaN NaN NaN NaN 
1 TS X Y [email protected] 03/10/2016 0.0 0.0 0.0 TS [email protected] ... 01/25/2016 0.0 0.0 0.0 NaN NaN NaN NaN NaN NaN 
2 TS X Y [email protected] 03/10/2016 0.0 0.0 0.0 TS [email protected] ... 04/06/2015 9.0 10.0 17.0 NaN NaN NaN NaN NaN NaN 
+0

NaN行は何を構成していますか?それは* any *値がNaNの行ですか?または* all *値がNaNの行?または...? – unutbu

+0

この場合、任意のNaN値を持つ行はすべてのNaN値を持つため、違いはありません。しかし、私はそれを言及すべきだった。 –

答えて

0

:ここ

for f in glob.glob("./gowall-users-export-*.xlsx"): 
    df = pd.read_excel(f) 
    all_users_sheets_hosts.append(df) 
    j = re.search('(\d+)', f) 
    df.columns = df.columns.str.replace('.*Hosted Meetings.*', 'Hosted Meetings' + ' ' + j.group(1)) 

all_users_sheets_hosts = reduce(lambda left,right: pd.merge(left,right,on=['First Name', 'Last Name'], how='outer'), all_users_sheets_hosts) 

は、得られたDFの最初の数行である:ここ

は私のforループ(および単一DFにマージ以降)、現在、EmailsCreatedFacilitated MeetingsAttended Meetings列の場合は、right DataFrameから削除してください。 Companyらので

import pandas as pd 
import functools 

for f in glob.glob("./gowall-users-export-*.xlsx"): 
    df = pd.read_excel(f) 
    all_users_sheets_hosts.append(df) 
    j = re.search('(\d+)', f) 
    df.columns = df.columns.str.replace('.*Hosted Meetings.*', 
             'Hosted Meetings' + ' ' + j.group(1)) 

# Drop rows of all NaNs from the final DataFrame in `all_users_sheets_hosts` 
all_users_sheets_hosts[-1] = all_users_sheets_hosts[-1].dropna(how='all', axis=0) 

def mergefunc(left, right): 
    cols = ['Company', 'Emails', 'Created', 'Facilitated Meetings', 'Attended Meetings'] 
    right = right.drop(cols, axis=1) 
    result = pd.merge(left, right, on=['First Name', 'Last Name'], how='outer') 
    return result 

all_users_sheets_hosts = functools.reduce(mergefunc, all_users_sheets_hosts) 

:全てNaN値を持つ行を削除するには、result.dropna(how='all', axis=0)を使用します。 al。列は、left DataFrame内にのみ存在し、それらの列の拡散はありません。ただし、leftright DataFramesの列の値が異なる場合、最初のDataFrameの値はall_users_sheets_hostsに保持されます。


代替、leftrightデータフレームはCompanyらに対して同じ値を持つ場合。 al。もう1つのオプションは、これらの列にも簡単にマージすることです。

def mergefunc(left, right): 
    cols = ['First Name', 'Last Name', 'Company', 'Emails', 'Created', 
      'Facilitated Meetings', 'Attended Meetings'] 
    result = pd.merge(left, right, on=cols, how='outer') 
    return result 
all_users_sheets_hosts = functools.reduce(mergefunc, all_users_sheets_hosts) 
+0

ありがとうございます。私はあなたの最初の提案を成功させましたが、行の削除は私が望んでいたものではありません。あなたが私に与えたコードでは、マージされたデータフレーム全体の中のすべて(または任意の)Naの行を削除しようとします。データフレームの最後にマージされたファイルのNa行のみを考慮したい –

+0

申し訳ありませんが、私はあなたの質問をより慎重に読むべきです。 'all_users_sheets_hosts [-1] = all_users_sheets_hosts [-1] .dropna(how = 'all'、axis = 0)'は 'all_users_sheets_hosts'の* last * DataFrameから空の(NaN)行だけを削除します。 – unutbu

+0

これをうまく動作させるのに問題があります。私はこれをちょっと試してみました。 all_users_sheets_hosts [-1]がall_users_sheets_hostsの最後の列ではないでしょうか?それでも、最後の列にある行は削除されません。 –

関連する問題