首页 > 解决方案 > 来自带有分类数据和自定义“箱”的熊猫数据框列的直方图/值计数

问题描述

考虑以下数据框:

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

我想根据一些自定义“箱”获得数据帧每一列中数据的相对频率,这些“箱”将是唯一数据值的(可能的超集)。例如,如果:

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

是否有一个(或两个)班轮来实现这一目标?

标签: pythonpandashistogramcategorical-data

解决方案


尝试,然后基于 b:apply value_countsreindex

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

Ameltcrosstab选项:

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

推荐阅读