我的DataFrame代表每列中的属性,每行代表yes
/ no
-值(如果适用):
d_att = { 'attribute1': ['yes', 'yes', 'no'],
'attribute2': ['no', 'yes', 'no'],
'attribute3': ['no', 'no', 'yes'] }
df_att = pd.DataFrame(data=d_att)
df_att
attribute1 attribute2 attribute3
0 yes no no
1 yes yes no
2 no no yes
现在我需要计算每种属性组合的可能性,例如如果attribute1
为yes
,则attribute2
也为yes
的可能性为0.5。
我的目标是这样的DataFrame:
attribute1 attribute2 attribute3
attribute1 1.0 0.5 0.0
attribute2 1.0 1.0 0.0
attribute3 0.0 0.0 1.0
到目前为止,我首先将yes
/ no
值替换为整数(1
/ 0
):
df_att_int = df_att.replace({'no': 0, 'yes': 1})
df_att_int
attribute1 attribute2 attribute3
0 1 0 0
1 1 1 0
2 0 0 1
然后,我定义了一种方法,该方法遍历每一列,过滤DataFrame中当前列中值为1
的行,计算过滤后的DataFrame中每一列的总和,然后将总和除以当前列的已过滤行数(= {sum
)
def combination_likelihood(df):
df_dict = {}
for column in df.columns:
col_sum = df[df[column]==1].sum()
divisor = col_sum[column]
df_dict[column] = col_sum.apply(lambda x: x/divisor)
return pd.DataFrame(data=df_dict).T
在我的df_att_int
-DataFrame上应用该方法会产生预期的结果:
df_att_comb_like = combination_likelihood(df_att_int)
df_att_comb_like
attribute1 attribute2 attribute3
attribute1 1.0 0.5 0.0
attribute2 1.0 1.0 0.0
attribute3 0.0 0.0 1.0
但是,如果属性/列名不是按字母顺序排列,则行将按标签排序,有见地的绘图所需的特征模式将丢失,例如,导致以下结构:
attribute2 attribute3 attribute1
attribute1 0.5 0.0 1.0
attribute2 1.0 0.0 1.0
attribute3 0.0 1.0 0.0
最终,我想将结果绘制为热图:
import seaborn as sns
sns.heatmap(df_att_comb_like)
是否有一种更简单,更优雅的方法来构造似然数据帧并为列和行标签保留相同的顺序?任何帮助将不胜感激!
答案 0 :(得分:3)
虽然我整理了一些更好的东西
df_att.eq('yes').astype(int) \
.pipe(lambda d: d.T.dot(d)) \
.pipe(lambda d: d.div(d.max(1), 0))
attribute1 attribute2 attribute3
attribute1 1.0 0.5 0.0
attribute2 1.0 1.0 0.0
attribute3 0.0 0.0 1.0
为数据框添加整数掩码
d = df_att.eq('yes').astype(int)
d
attribute1 attribute2 attribute3
0 1 0 0
1 1 1 0
2 0 0 1
点产品本身
d2 = d.T.dot(d)
d2
attribute1 attribute2 attribute3
attribute1 2 1 0
attribute2 1 1 0
attribute3 0 0 1
将每一行与该行的最大值分开
d2.div(d2.max(axis=1), axis=0)
attribute1 attribute2 attribute3
attribute1 1.0 0.5 0.0
attribute2 1.0 1.0 0.0
attribute3 0.0 0.0 1.0
答案 1 :(得分:0)
这与 机器学习 算法非常相似。称为“ 感知器 ”,它可以修正每个数据点的均值函数。如果您掌握了Sebastian Raschka的python机器学习pdf文档,则可以在第25页上看到此实现,您可能需要阅读Perceptron规则。您可以使用lambda函数,for循环或其他多种方式来实现此循环。
阈值函数是一个我可能还要检查您的状况的术语,因为它与您要实现的非常接近。
for _ in range(self.n_iter):
errors = 0
for xi, target in zip(X, y):
update = self.eta * (target - self.predict(xi))
self.w_[1:] += update * xi
self.w_[0] += update
errors += int(update != 0.0)
self.errors_.append(errors)
return self
第125到133行
还有一个笔记本链接,可在此处进一步说明步骤: ipyn
在我在这里列出的代码中,选择了for循环作为实现。我个人将应用 lambda 函数或map()函数。