2017-06-03 26 views
0

我試圖做的事:分配Series對象到數據幀

def processor(self, col): 
    # Some work here 
    col.fillna(0, inplace=True) 
    return col 

def main(df): 
    pool = Pool(self.cpu_size) 
    for series_obj, data in pool.imap(
      processor, [df[i] for i in df[col_list]]): 
     print(bool(series_obj.is_copy)) 
     print(bool(df.is_copy)) 
     df[series_obj.name] = series_obj 

但我得到一個警告:

值要試圖從片的副本設置一個DataFrame。

如何在沒有此警告的情況下對DataFrame和Series對象執行相同的操作?可能是因爲處理過的series_obj是來自初始df的一列,但print(bool(series_obj.is_copy))返回False並且print(bool(df.is_copy))返回True,這可能是暗示。

問題在於使用鏈接索引創建的df參數。

回答

0

的問題是在使用鏈式索引創建的DF參數重新創建此。但是在主函數執行過程中出現錯誤。

1

只要series_obj具有兼容的索引,那麼您嘗試執行的操作就沒有任何問題。

問題在於你如何構建df。它的創建方式是將其標記爲另一個數據幀的視圖。你可以通過輸入bool(df.is_copy)來驗證。應該回來True

所以,讓你的df不是視圖通過了:

df = df.copy() 

這會從什麼都其他數據框它從形成解開它。請注意,如果你想要這個糾纏,它將不再是!

然後你就可以

df[series_obj.name] = series_obj 

附註:我不能實際0.20

df_source = pd.DataFrame(1, list('abc'), list('xyz')) 

df = df_source[['x', 'z']] 

series_obj = pd.Series(2, list('abc')) 

print(bool(df.is_copy)) 

df[series_obj.name] = series_obj 

print(bool(df.is_copy)) 

True 
False 
+0

這真的很棘手,我也不能複製這個簡單的腳本的問題。我在帖子中增加了更多細節。 – SayPy