您可以使用
value counts和
pd.Series(感谢改进乔恩)ie
ndf = df.apply(pd.Series.value_counts).fillna(0)2017-08-09 2017-08-10活跃_1 2 3.0active_1-3 1 0.0active_3-7 1 1.01前1.0
时间 :
k = pd.concat([df]*1000)# @cᴏʟᴅsᴘᴇᴇᴅ's method %%timeitpd.get_dummies(k.T).groupby(by=lambda x: x.split('_', 1)[1], axis=1).sum().T1 loop, best of 3: 5.68 s per loop%%timeit# @cᴏʟᴅsᴘᴇᴇᴅ's method k.stack().str.get_dummies().sum(level=1).T10 loops, best of 3: 84.1 ms per loop# My method %%timeitk.apply(pd.Series.value_counts).fillna(0)100 loops, best of 3: 7.57 ms per loop# FabienP's method %%timeitk.unstack().groupby(level=0).value_counts().unstack().T.fillna(0)100 loops, best of 3: 7.35 ms per loop#@Wen's method (fastest for now) pd.concat([pd.Series(collections.Counter(k[x])) for x in df.columns],axis=1)100 loops, best of 3: 4 ms per loop


