pandas 如何计算数据帧pandas-python中值的条件概率?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/37818063/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to calculate conditional probability of values in dataframe pandas-python?
提问by CSMaverick
I want to calculate conditional probabilites of ratings('A','B','C') in ratings column.
我想在 ratings 列中计算 ratings('A','B','C') 的条件概率。
company model rating type
0 ford mustang A coupe
1 chevy camaro B coupe
2 ford fiesta C sedan
3 ford focus A sedan
4 ford taurus B sedan
5 toyota camry B sedan
Output:
输出:
Prob(rating=A) = 0.333333
Prob(rating=B) = 0.500000
Prob(rating=C) = 0.166667
Prob(type=coupe|rating=A) = 0.500000
Prob(type=sedan|rating=A) = 0.500000
Prob(type=coupe|rating=B) = 0.333333
Prob(type=sedan|rating=B) = 0.666667
Prob(type=coupe|rating=C) = 0.000000
Prob(type=sedan|rating=C) = 1.000000
Any help, Thanks..!!
任何帮助,谢谢.. !!
回答by Stefan
You can use .groupby()
and the built-in .div()
:
您可以使用.groupby()
和内置的.div()
:
rating_probs = df.groupby('rating').size().div(len(df))
rating
A 0.333333
B 0.500000
C 0.166667
and the conditional probs:
和条件问题:
df.groupby(['type', 'rating']).size().div(len(df)).div(rating_probs, axis=0, level='rating')
coupe A 0.500000
B 0.333333
sedan A 0.500000
B 0.666667
C 1.000000
回答by Gustavo Bezerra
You can use groupby
:
您可以使用groupby
:
In [2]: df = pd.DataFrame({'company': ['ford', 'chevy', 'ford', 'ford', 'ford', 'toyota'],
'model': ['mustang', 'camaro', 'fiesta', 'focus', 'taurus', 'camry'],
'rating': ['A', 'B', 'C', 'A', 'B', 'B'],
'type': ['coupe', 'coupe', 'sedan', 'sedan', 'sedan', 'sedan']})
In [3]: df.groupby('rating').count()['model'] / len(df)
Out[3]:
rating
A 0.333333
B 0.500000
C 0.166667
Name: model, dtype: float64
In [4]: (df.groupby(['rating', 'type']).count() / df.groupby('rating').count())['model']
Out[4]:
rating type
A coupe 0.500000
sedan 0.500000
B coupe 0.333333
sedan 0.666667
C sedan 1.000000
Name: model, dtype: float64
回答by jezrael
You need add reindex
for add 0
values for missing pairs:
您需要为缺失对reindex
添加0
值:
mux = pd.MultiIndex.from_product([df['rating'].unique(), df['type'].unique()])
s = (df.groupby(['rating', 'type']).count() / df.groupby('rating').count())['model']
s = s.reindex(mux, fill_value=0)
print (s)
A coupe 0.500000
sedan 0.500000
B coupe 0.333333
sedan 0.666667
C coupe 0.000000
sedan 1.000000
Name: model, dtype: float64
And another solution, thanks Zero:
另一个解决方案,感谢零:
s.unstack(fill_value=0).stack()
回答by 1_e
first, convert into a pandas dataframe. by doing so, you can take advantage of pandas' groupby methods.
首先,转换为Pandas数据框。通过这样做,您可以利用Pandas的 groupby 方法。
collection = {"company": ["ford", "chevy", "ford", "ford", "ford", "toyota"],
"model": ["mustang", "camaro", "fiesta", "focus", "taurus", "camry"],
"rating": ["A", "B", "C", "A", "B", "B"],
"type": ["coupe", "coupe", "sedan", "sedan", "sedan", "sedan"]}
df = pd.DataFrame(collection)
then, groupby based on events (ie rating).
然后,基于事件(即评级)进行分组。
df_s = df.groupby('rating')['type'].value_counts() / df.groupby('rating')['type'].count()
df_f = df_s.reset_index(name='cpt')
df_f.head() # your conditional probability table