2017-12-15 45 views
1

ExcelシートをPandas DataFrameに読み込みたいと思います。ただし、以下に示すように、マージされたExcelセルとNULL行(完全/部分NaNが入っています)があります。明確にするために、John H.は "The Bodyguard"から "Red Pill Blues"までのすべてのアルバムを購入するように指示しました。NaNで結合されたExcelセルをPandas DataFrameに読み込む方法

Excel sheet capture

私はパンダDATAFRAMEにこのExcelシートを読み込むときに、Excelのデータが正しく転送されません。 Pandasは、マージされたセルを1つのセルとみなします。データフレームは、次のようになります。(注:()内の値は、私がそこに持っているしたい所望の値です)

Dataframe capture

最後の行がマージされた細胞が含まれていないことに注意してください。それはArtist列の値しか運びません。


EDIT: 私は次のように将来を埋めるためにはNaN :( Pandas: Reading Excel with merged cells値にしようとしなかった)

df.index = pd.Series(df.index).fillna(method='ffill') 

しかし、NaN値が残っています。 DataFrameを正しく設定するために使用できる戦略または方法はありますか?セルを解体して対応する内容を複製するパンダの方法はありますか?

+3

何か試しましたか?あなたの試行を見せてもらえますか?この投稿が役立つかもしれません:https://stackoverflow.com/questions/22937650/pandas-reading-excel-with-merged-cells – Vico

+1

[パンダ:マージされたセルでExcelを読む](https://stackoverflow.com)の可能な複製/ questions/22937650/pandas-reading-excel-with-merged-cells) –

+1

@Vico - ちょうど参考になるだけでなく、まったく同じ質問です! –

答えて

0

条件付きの使用:

import pandas as pd 

df_excel = pd.ExcelFile('Sales.xlsx') 
df = df_excel.parse('Info') 

for col in list(df): # All columns 
    pprow = 0 
    prow = 1 
    for row in df[1:].iterrows(): # All rows, except first 
     if pd.isnull(df.loc[prow, 'Album Name']): # If this cell is empty all in the same row too. 
      continue 
     elif pd.isnull(df.loc[prow, col]) and pd.isnull(df.loc[row[0], col]): # If a cell and next one are empty, take previous valor. 
      df.loc[prow, col] = df.loc[pprow, col] 
     pprow = prow 
     prow = row[0] 

出力(私は別の名前を使用):

Order_ID Customer_name Album Name 
0  NaN   NaN   Radio 
1  1.0   John   a 
2  1.0   John    b 
3  1.0   John    c 
4  1.0   John    d 
5  1.0   John    e 
6  1.0   John    f 
7  NaN   NaN   GE 
8  2.0   Harry We are Born 
9  3.0  Lizzy  Relapse 
10  4.0   Abe   Smoke 
11  4.0   Abe  Tell me 
12  NaN   NaN   NaN 
13  NaN   NaN  Best Buy 
14  5.0  Kristy  The wall 
15  6.0   Sammy Kind of blue 
+0

@ Manuel - あなたのソリューションを試しましたが、次のエラーが表示されます:KeyError:ラベル[-1]が[index]にありません。このエラーは、コードの最後の行から発生します。最後の行は 'df.loc [row [0]、col] = df.loc [row [0] +1、col]'でなければならない?あなたの論理を説明するためにあなたの答えにインラインのコメントを含めることができれば、感謝するでしょう。私はPython Pandasには新しく、ここであなたのロジックをよりよく理解したいと思っています。ありがとうございました。 – CPU

+0

@ Manuel - あなたのソリューションは、マージされていないセルを持つ通常の行である私のExcelシート(上のスクリーンショット)の最後の行をどうしますか?この行は前の行( 'Order_ID 15')とマージされているように見えますが、この最後の行は独自の行です。 – CPU

+0

@Mook私はちょうど編集した、見てみましょう。 – Manuel

1

をあなたがしようとし、参照リンクのみインデックス列を埋める転送する必要がありました。あなたのユースケースでは、すべてデータフレームの列に対してfillnaが必要です。したがって、単純にデータフレーム全体を転送してください:

df = pd.read_excel("Input.xlsx") 
print(df) 

# Order_ID Customer_name   Album_Name   Artist Quantity 
# 0  NaN   NaN   RadioShake    NaN  NaN 
# 1  1.0  John H.   The Bodyguard Whitney Houston  2.0 
# 2  NaN   NaN    Lemonade   Beyonce  1.0 
# 3  NaN   NaN The Thrill Of It All  Sam Smith  2.0 
# 4  NaN   NaN    Thriller Michael Jackson  11.0 
# 5  NaN   NaN    Divide  Ed Sheeran  4.0 
# 6  NaN   NaN   Reputation  Taylor Swift  3.0 
# 7  NaN   NaN  Red Pill Blues   Maroon 5  5.0 

df = df.fillna(method='ffill') 
print(df) 

# Order_ID Customer_name   Album_Name   Artist Quantity 
# 0  NaN   NaN   RadioShake    NaN  NaN 
# 1  1.0  John H.   The Bodyguard Whitney Houston  2.0 
# 2  1.0  John H.    Lemonade   Beyonce  1.0 
# 3  1.0  John H. The Thrill Of It All  Sam Smith  2.0 
# 4  1.0  John H.    Thriller Michael Jackson  11.0 
# 5  1.0  John H.    Divide  Ed Sheeran  4.0 
# 6  1.0  John H.   Reputation  Taylor Swift  3.0 
# 7  1.0  John H.  Red Pill Blues   Maroon 5  5.0 
関連する問題