来自 Pandas 数据帧列的直方图/值计数,其中包含分类数据和自定义"bins"



考虑以下数据帧:

import pandas as pd
x = pd.DataFrame([[ 'a', 'b'], ['a', 'c'], ['c', 'b'], ['d', 'c']])
print(x)
0  1
0  a  b
1  a  c
2  c  b
3  d  c

我想基于一些自定义的"频率"来获得数据帧的每一列中的数据的相对频率;bins";其将是唯一数据值(可能的超集合(。例如,如果:

b = ['a', 'b', 'c', 'd', 'e', 'f']

我想获得:

0  1
a  2  0
b  0  2
c  1  2
d  1  0
e  0  0
f  0  0

有没有一个(或两个(衬垫可以实现这一点?

基于b:尝试applyvalue_counts,然后尝试reindex

import pandas as pd
x = pd.DataFrame([['a', 'b'], ['a', 'c'], ['c', 'b'], ['d', 'c']])
b = ['a', 'b', 'c', 'd', 'e', 'f']
df = x.apply(lambda s: s.value_counts()).reindex(b).fillna(0).astype(int)
print(df)

df:

0  1
a  2  0
b  0  2
c  1  2
d  1  0
e  0  0
f  0  0

meltcrosstab选项:

import pandas as pd
x = pd.DataFrame([['a', 'b'], ['a', 'c'], ['c', 'b'], ['d', 'c']])
b = ['a', 'b', 'c', 'd', 'e', 'f']
df = x.melt()
df = pd.crosstab(df['value'], df['variable']) 
.reindex(b).fillna(0).astype(int) 
.rename_axis(None, axis=1).rename_axis(None, axis=0)
print(df)

df:

0  1
a  2  0
b  0  2
c  1  2
d  1  0
e  0  0
f  0  0

最新更新