2017-07-03 69 views
0

我有一個列表,當填充時,將放入pandas dataframe。有時,main_list在每個list中有4個元素,有時它有3pandas斷言空列錯誤

# Example list 1 
[["foo1", "baa1", "faa1", "gaa1"], ["foo2", "baa2", "faa2", "gaa2"], ["foo3", "baa3", "faa3", "gaa3"]] 

# Example list 2 
[["foo1", "baa1", "faa1"], ["foo2", "baa2", "faa2"], ["foo3", "baa3", "faa3", "gaa3"]] 

我定義我的熊貓數據框列,當我讀了main_list進去。我似乎沒有執行以下代碼example list 1 and 2的問題。

pandas.Dataframe(example_list, columns={"col1", "col2", "col3", "col4"}) 

我的問題進來的時候,有時,在特殊的場合,example list 3自帶約

# Example list 3 
[["foo1", "baa1", "faa1"], ["foo2", "baa2", "faa2"], ["foo3", "baa3", "faa3"]] 

發生這種情況時,只有3列表,而不是通常4元素。熊貓然後會扔我AssertionError: 4 columns passed, passed data had 3 columns

我明白髮生了什麼,因爲只有3元素。但是我能做些什麼來解決這個問題呢?

回答

1

你可以先創建一個通用的數據幀(不指定列名稱),然後重命名事後列:

df = pd.DataFrame(example_list) 
df.columns = columns[:len(df.columns)] 
df = df.reindex(columns=columns) 

example_list是您的第三個示例時,pd.DataFrame(example_list)將只有3列。爲確保df具有全部四列,請使用reindex。這是上面最後一行的目的。


例如,

import pandas as pd 

A = [["foo1", "baa1", "faa1", "gaa1"], ["foo2", "baa2", "faa2", "gaa2"], ["foo3", "baa3", "faa3", "gaa3"]] 

B = [["foo1", "baa1", "faa1"], ["foo2", "baa2", "faa2"], ["foo3", "baa3", "faa3", "gaa3"]] 

C = [["foo1", "baa1", "faa1"], ["foo2", "baa2", "faa2"], ["foo3", "baa3", "faa3"]] 

columns = "col1", "col2", "col3", "col4" 

for example_list in (A, B, C): 
    df = pd.DataFrame(example_list) 
    df.columns = columns[:len(df.columns)] 
    df = df.reindex(columns=columns) 
    print(df) 

產生

col1 col2 col3 col4 
0 foo1 baa1 faa1 gaa1 
1 foo2 baa2 faa2 gaa2 
2 foo3 baa3 faa3 gaa3 
    col1 col2 col3 col4 
0 foo1 baa1 faa1 None 
1 foo2 baa2 faa2 None 
2 foo3 baa3 faa3 gaa3 
    col1 col2 col3 col4 
0 foo1 baa1 faa1 NaN 
1 foo2 baa2 faa2 NaN 
2 foo3 baa3 faa3 NaN 
2

這是我會做什麼有一個通用的解決方案,利用大熊貓reindex

column_names = ["col1", "col2", "col3", "col4"] 

def max_elements(nested_lst): 
    return max([len(lst) for lst in nested_lst])  

pandas.DataFrame(example_list, 
       columns=column_names[:max_elements(example_list)]).reindex(columns = column_names) 

這是我與你的最新列表輸出:

col1 col2 col3 col4 
0 foo1 baa1 faa1 NaN 
1 foo2 baa2 faa2 NaN 
2 foo3 baa3 faa3 NaN 
+0

嗯,有可能做這樣的事情'fillna'爲空列呢? –

+0

當然,您想要填寫哪個值?您可以使用reindex – FLab

+0

的fill_value參數不,我的意思是,保留'4 column_names',但用NAN或其他東西填充空列。這可能嗎?我傾向於保留'4 column_names',因爲稍後的代碼會使用它。 –