我正在尝试计算pandas
数据帧的三列中数字的频率。我的数据示例如下:
0 1 2
0 2 1 2
1 0 2 0
2 0 0 2
3 0 2 2
4 1 1 0
5 2 0 2
6 2 2 2
7 2 2 1
8 0 1 2
9 0 0 2
我想计算特定数字同时出现的频率。例如。我希望最终输出看起来像这样:
0 1 2 freq
0 0 0 0
0 0 1 0
0 0 2 2
0 1 0 0
...
2 2 2 1
我尝试使用pd.melt
失败。这是重构我的问题的代码:
a = np.random.randint(0,3, 10)
b = np.random.randint(0,3, 10)
c = np.random.randint(0,3, 10)
df = pd.DataFrame([a,b,c]).T
如果有人有任何建议,将不胜感激!
答案 0 :(得分:1)
import numpy as np
import pandas as pd
from itertools import product
np.random.seed(42)
a = np.random.randint(0, 3, 10)
b = np.random.randint(0, 3, 10)
c = np.random.randint(0, 3, 10)
df = pd.DataFrame([a, b, c]).T
columns = ['start', 'middle', 'end']
df.columns = columns
result = df.groupby(columns).size()
result = result.reindex(product([0, 1, 2], repeat=3)).fillna(0).astype(int).reset_index()
result.columns = [0, 1, 2, 'freq']
print(result)
输出
0 1 2 freq
0 0 0 0 1
1 0 0 1 0
2 0 0 2 0
3 0 1 0 1
4 0 1 1 0
5 0 1 2 0
6 0 2 0 1
7 0 2 1 0
8 0 2 2 0
9 1 0 0 0
10 1 0 1 0
11 1 0 2 0
12 1 1 0 0
13 1 1 1 0
14 1 1 2 1
15 1 2 0 0
16 1 2 1 0
17 1 2 2 0
18 2 0 0 0
19 2 0 1 1
20 2 0 2 0
21 2 1 0 1
22 2 1 1 0
23 2 1 2 2
24 2 2 0 1
25 2 2 1 1
26 2 2 2 0
请注意,此输出是为以下df
生成的:
0 1 2
0 2 2 0
1 0 2 0
2 2 0 1
3 2 2 1
4 0 1 0
5 0 0 0
6 2 1 0
7 1 1 2
8 2 1 2
9 2 1 2
答案 1 :(得分:1)
这不会为您提供未显示的组合(您可以使用reindex
或类似的组合),但是可以将pivot_tables
设置为{ {1}}生成它们。您需要添加aggfunc
的{{1}}列,以便np.sum
可以添加一些内容:
frequency
输出:
1