2014-09-04 50 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