熊猫使用外部列表计数值

用户名

我有这种数据框:

import pandas as pd

df = pd.DataFrame()
df['s1'] = ['n', 'u', 'u', 'u', 'n', 't', 't']
df['s2'] = ['n', 'n', 'u', 'u', 'n', 't', 't']
df['s3'] = ['o', 'o', 'o', 'o', 'o', 'o', 'o']
df['s4'] = ['u', 'u', 'u', 'u', 'n', 't', 't']

我尝试获得一个数据框df2该数据框具有['n', 'u', 't', 'o']索引,['s1', 's2', 's3', 's4']列名称和'n', 'u', 't', 'o'列的编号sX所以df2['n', 's1']2

感谢您的帮助。

耶斯列尔

value_counts所有列与替换缺失值0并转换为整数一起使用:

df = df.apply(pd.value_counts).fillna(0).astype(int)
print (df)
   s1  s2  s3  s4
n   2   3   0   1
o   0   0   7   0
t   2   2   0   2
u   3   2   0   4

DataFrame.stack带有MultiIndex的Series的另一种解决方案,然后使用,SeriesGroupBy.value_counts并通过进行最后Series.unstack整形,但这在大DataFrames中较慢

df = df.stack().groupby(level=1).value_counts().unstack(0, fill_value=0)

性能

np.random.seed(123)
N = 100000
L = list('notu')

df = pd.DataFrame(np.random.choice(L, size=(N, 100))).add_prefix('s')
#print (df)
In [258]: %%timeit 
     ...: d=df.melt()
     ...: count_df=pd.crosstab(d['value'],d['variable'])
     ...: 
2.59 s ± 86.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


In [260]: %%timeit
     ...: df.apply(pd.value_counts).fillna(0).astype(int)
     ...: 
942 ms ± 43.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


In [262]: %%timeit
     ...: df.stack().groupby(level=1).value_counts().unstack(0, fill_value=0)
     ...: 
10.9 s ± 547 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章