我想获取一列中字符串的频率计数。一方面,这类似于将数据框折叠为仅反映列中的字符串的一组行。我能够通过循环解决此问题,但知道有更好的解决方案。
df示例:
2017-08-09 2017-08-10 id 0 pre pre 2 active_1-3 active_1 3 active_1 active_1 4 active_3-7 active_3-7 5 active_1 active_1
并想出去:
2017-08-09 2017-08-10 pre 1 1 active_1 2 3 active_1-3 3 0 active_3-7 1 1
我搜索了很多论坛,但找不到合适的答案。
我假设使用pivot_table方法是正确的方法,但是无法获取正确的参数来折叠没有为输出df提供明显索引的表。
我可以通过使用value_counts()遍历每列并将每个值计数系列附加到新的数据帧中来使其工作,但是我知道有更好的解决方案。
for i in range(len(date_cols)): new_values = df[date_cols[i]].value_counts() output_df = pd.concat([output_df , new_values], axis=1)
谢谢!
您可以使用value counts和pd.Series(感谢改进乔恩)ie
value counts
pd.Series
ndf = df.apply(pd.Series.value_counts).fillna(0) 2017-08-09 2017-08-10 活跃_1 2 3.0 active_1-3 1 0.0 active_3-7 1 1.0 1前1.0
时间 :
k = pd.concat([df]*1000) # @cᴏʟᴅsᴘᴇᴇᴅ's method %%timeit pd.get_dummies(k.T).groupby(by=lambda x: x.split('_', 1)[1], axis=1).sum().T 1 loop, best of 3: 5.68 s per loop %%timeit # @cᴏʟᴅsᴘᴇᴇᴅ's method k.stack().str.get_dummies().sum(level=1).T 10 loops, best of 3: 84.1 ms per loop # My method %%timeit k.apply(pd.Series.value_counts).fillna(0) 100 loops, best of 3: 7.57 ms per loop # FabienP's method %%timeit k.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