考虑以下数据帧:
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:尝试apply
value_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
melt
和crosstab
选项:
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