如何计算熊猫三列中的路径频率

时间:2019-02-05 18:00:53

标签: python pandas

我正在尝试计算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

如果有人有任何建议,将不胜感激!

2 个答案:

答案 0 :(得分:1)

您可以使用groupby + reindex

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