2014-09-04 52 views
0

創建分箱數據的計數我有一個數據幀,我想要在另一列中根據np.nan在一列中獲得0。 這是爲了讓我得到兩個不同的計數基於兩個不同的列,這些列在不同的地方有nan。 我使用平均值對整個數據框進行分箱,使用總和來分箱。下面的代碼有效,但.loc行使我的真實數據非常慢。使用.loc,緩慢

my_df = pd.DataFrame({"a": np.random.random(100), 
        "b": np.random.random(100), 
        "id": np.arange(100)}) 

my_df['a'][23] = np.nan 
my_df['b'][56] = np.nan 

my_df['count_type1'] = 1 
my_df['count_type2'] = 1 

my_df.loc[(my_df.a.isnull()), my_df.count_type1] = 0 
my_df.loc[(my_df.b.isnull()), my_df.count_type2] = 0 

bins = np.linspace(0, 1, 10) 
groups = my_df.groupby(np.digitize(my_df.a, bins)) 

binned_data_mean = groups.mean() 
binned_data_counts = groups.sum() 

binned_data_mean['count_type1'] = binned_data_counts['count_type1'] 
binned_data_mean['count_type2'] = binned_data_counts['count_type2'] 

有沒有更快的方法來實現我想要的?

+0

您的代碼產生錯誤,不應該這是'my_df.loc [(my_df.a.isnull()), 'count_type1'] = 0 my_df .loc [(my_df.b.isnull()),'count_type2'] = 0'?我也得到857us使用這個版本,如果我使用'where'這變成723us – EdChum 2014-09-04 13:51:44

+0

嗯,這很奇怪,它不會給我錯誤,當我運行它。我會嘗試使用while方法來創建自己的代碼。當我添加這行代碼時,我感到驚訝,因爲之前我所有的代碼(大約200行,儘管沒有多少說明)幾乎立即運行,現在大約需要兩分鐘。 – branches 2014-09-04 14:15:59

回答

2

如果你需要指標變量,Prob可以做這樣的事情。

In [28]: %timeit my_df['count_type1'] = my_df.a.where(my_df.a.isnull(),1).fillna(0) 
1000 loops, best of 3: 611 µs per loop 

這是更好

In [47]: %timeit my_df['count_type1'] = my_df.a.notnull().astype(int) 
1000 loops, best of 3: 275 µs per loop