我有這個資料框df,它具有布林值:
A B C
0 0 1 0
1 0 1 1
2 0 1 1
3 1 0 1
4 0 0 0
5 1 0 0
6 0 0 0
7 0 0 1
8 1 0 0
9 0 0 0
10 1 0 1
11 1 0 1
12 0 1 1
13 1 0 0
14 1 0 0
15 0 1 0
16 1 1 0
17 0 0 1
18 1 0 1
19 1 0 0
20 1 0 1
21 1 1 0
22 1 1 1
23 1 1 1
24 1 0 0
25 1 1 0
26 0 0 1
27 0 1 1
28 0 1 0
29 1 1 0
30 1 0 1
31 0 1 0
32 0 0 1
33 1 1 1
34 0 1 0
35 1 1 0
36 0 1 0
37 0 0 1
38 0 1 1
39 0 1 1
我存盤的行數如下:
N = len(df.index) # 40 in this case
使用 groupby ,我計算 df 的每個實體如下:
count_series = df.groupby(["A", "B", "C"]).size() #all columns
new_df = count_series.to_frame(name = 'count').reset_index()
print(new_df)
new_df看起來像這樣:
A B C count
0 0 0 0 3
1 0 0 1 5
2 0 1 0 6
3 0 1 1 6
4 1 0 0 6
5 1 0 1 6
6 1 1 0 5
7 1 1 1 3
現在df行數是N =40 ,我想創建一個新的資料框 dfD ,它具有與df相同的列加上名為 P(A,B,C) 的附加列,它具有每個組合的概率。例如,任何值為 0,0,0 的行都應該有 count/N (3/40),即 0.075 我找到了這些帖子,但它們都沒有幫助,因為它們都在使用案例,因為我的df不會只有 3 列(A、B、C)或只有 40 行。它可能更大, link1 link2 我想要的東西可以與任何大小的任何資料框一起使用
uj5u.com熱心網友回復:
將每一行轉換為tuple并使用groupby
grp = df.apply(tuple, axis=1)
pd.concat([df.groupby(grp).first(),
grp.groupby(grp).count().div(len(df)).rename("Probs")],
axis=1).reset_index(drop=True)
uj5u.com熱心網友回復:
我們可以使用value_countswith 引數normalize=True來計算概率,然后將得到的概率與原始資料幀合并
c = ['A', 'B', 'C']
df.merge(df[c].value_counts(normalize=True).reset_index(name='prob'))
A B C prob
0 0 1 0 0.150
1 0 1 0 0.150
2 0 1 0 0.150
3 0 1 0 0.150
...
18 0 0 0 0.075
...
38 1 1 1 0.075
39 1 1 1 0.075
uj5u.com熱心網友回復:
繼續你自己的方法......
# subset of columns you want to use
columns = new_df.columns[:-1]
# use np.add.reduce to concatenate with astype(str)
new_df['key'] = np.add.reduce(new_df[columns].astype(str), axis=1)
new_df['prob'] = new_df['count'] / N
# do the same in df
df['key'] = np.add.reduce(df.astype(str), axis=1)
# maintain a mapping
mapping = new_df[['key', 'prob']].set_index('key').to_dict()['prob']
# map it
df['P(ABC)'] = df['key'].map(mapping)
df.drop('key', axis=1, inplace=True)
df[columns] = df[columns].astype(int) # or astype(bool)
df
A B C P(ABC)
0 0 1 0 0.150
1 0 1 1 0.150
2 0 1 1 0.150
3 1 0 1 0.150
4 0 0 0 0.075
5 1 0 0 0.150
6 0 0 0 0.075
7 0 0 1 0.125
8 1 0 0 0.150
9 0 0 0 0.075
10 1 0 1 0.150
11 1 0 1 0.150
12 0 1 1 0.150
13 1 0 0 0.150
14 1 0 0 0.150
15 0 1 0 0.150
16 1 1 0 0.125
17 0 0 1 0.125
18 1 0 1 0.150
19 1 0 0 0.150
20 1 0 1 0.150
21 1 1 0 0.125
22 1 1 1 0.075
23 1 1 1 0.075
24 1 0 0 0.150
25 1 1 0 0.125
26 0 0 1 0.125
27 0 1 1 0.150
28 0 1 0 0.150
29 1 1 0 0.125
30 1 0 1 0.150
31 0 1 0 0.150
32 0 0 1 0.125
33 1 1 1 0.075
34 0 1 0 0.150
35 1 1 0 0.125
36 0 1 0 0.150
37 0 0 1 0.125
38 0 1 1 0.150
39 0 1 1 0.150
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/453435.html
上一篇:如何自動化資料幀的序列?
