2017-01-16 23 views
0

在M *(N + 1)以填充大熊貓數據幀的缺失值大熊貓數據幀data_df,有一個timestamp列,其值可能重複整數在range(0,p)(其表示時間;有總共p個唯一值)並且沒有缺失值。還有其他列data_1,data_2,data_3,... data_n,每個列都有一些缺失值。快速的方式與複雜的規則

我想填補數據列的每一行中的缺失值,使用與該行的timestamp值相關的特定數字。因此,我獲得了p * n熊貓數據框median_tablemedian_table的第i行上的值用於填充其timestamp是i的data_df中的缺失值。

但是,我不能想出一個快速和內存友好的方式來做到這一點。目前,我使用下面的代碼(median_tabledata_df和已定義):

new_data_df = pd.DataFrame() 
for _timestamp in median_table.timestamp: 
    temp_df = data_df.loc[data_df.timestamp == _timestamp] 
    temp_df.fillna(median_table.loc[_timestamp, :], inplace=True) 
    new_data_df = new_data_df.append(temp_df) 

這是非常低效的。另一種算法:

for _timestamp in median_table.timestamp: 
    data_df.loc[data_df.timestamp == _timestamp] = \ 
     data_df.loc[data_df.timestamp == _timestamp]\ 
      .fillna(median_table.loc[_timestamp, :], inplace=False) 

對我來說工作速度相當慢。

有沒有更快的方法來做同樣的事情?

回答

0

嘗試這種方法:確定data_df中的NaN並將其與median_table合併。我期望比for循環更快。道歉,如果我錯誤地認爲你的數據結構,但這可能至少讓你開始:

import pandas as pd 
import numpy as np 

# Create dummy dataframe 
data_df = pd.DataFrame({ 
    "timestamp": [1, 2, 3, 4], 
    "data": [1, 2, np.nan, np.nan] 
    }) 
print data_df 
""" 
Dataframe looks like: 
data timestamp 
1.0   1 
2.0   2 
NaN   3 
NaN   4 
""" 

# Create dummy median table 
median_table = pd.DataFrame({ 
    "timestamp": [1, 2, 3, 4], 
    "missing_data": [100, 200, 300, 400] 
    }) 
print median_table 
""" 
Median table looks like: 
missing_data timestamp 
    100   1 
    200   2 
    300   3 
    400   4 
""" 

# Find NaNs in "data" column in data_df 
nan_indexes = data_df["data"].isnull() 
nan_df = data_df[nan_indexes] 
print nan_df 
""" 
nan_df looks like: 
data timestamp 
NaN   3 
NaN   4 
""" 

# Merge nan_df with median_table based on timestamp column 
new_df = pd.merge(left=nan_df, right=median_table, on="timestamp", how="left") 
print new_df 
""" 
new_df looks like: 
data timestamp missing_data 
NaN   3   300 
NaN   4   400 
""" 

# Clean up new_df 
new_df = new_df[["timestamp", "missing_data"]] # Discard "data" column 
new_df.columns = ["timestamp", "data"] # Rename "missing_data" column to "data" 
print new_df 
""" 
new_df now looks like: 
timestamp data 
3 300 
4 400 
""" 
+0

謝謝!但是,我剛剛意識到使用'DataFrame.groupby()'方法而不是在開始時創建新的中值表可能非常有效。 –