我有这种数据框:
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
整形,但这在大DataFrame
s中较慢:
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] 删除。
我来说两句