我有一个看起来像这样的数据框
addClickListener(e) {
var self = this;
e.addEventListener('click', function() {
self.moveCharTo(e);
}, false);
}
removeClickListener(e) {
var self = this;
e.removeEventListener('click', function(){
self.moveCharTo(e);
}, false);
}
其中“ fail”和“ success”是列的名称,“ aa”,“ ab”,“ aback”等是行的标签。 该表包含一个单词(“ ab”,“ aback”等)在一组文本(2组:“ fail”和“ success”)中出现的次数。
有没有一种方法可以根据单词在一组中的唯一性将每个行标签与列名相关联?
输出应如下所示:
fail success
aa 1 0
ab 1 0
aback 0 1
abandon 3 1
abate 0 1
abc 1 0
谢谢!
答案 0 :(得分:3)
您可以通过dict
理解来做到这一点:
{col: list(df.loc[(df[col] > 0) & (df.drop(columns=col) == 0).all(axis=1), col].iteritems())
for col in df.columns}
输出:
{'fail': [('aa', 1), ('ab', 1), ('abc', 1)],
'success': [('aback', 1), ('abate', 1)]}
即使您有两列以上,这也将起作用。实际上,对于每列,它要做的就是获得满足以下两个条件的索引值对:
如果您假设不存在所有值都不为零的行,则可以删除第一个条件,该条件为:
{col: list(df.loc[(df.drop(columns=col) == 0).all(axis=1), col].iteritems())
for col in df.columns}
答案 1 :(得分:0)
让我们先完成“成功”的一半:
df.success[df.fail==0]
这将为您提供失败为零的成功值:
aback 1
abate 1
如果您确实需要一个列表列表,请执行以下操作:
df.success[df.fail==0].reset_index().values.tolist()
现在您拥有:
[['aback', 1], ['abate', 1]]
或者,对于示例输出中的元组列表:
s = df.success[df.fail==0]
list(zip(s.index, s))
将成功与失败交换为结果的另一半,就可以了。
答案 2 :(得分:0)
使用熊猫nunique
和stack
,然后groupby
通过dict
得到to_dict
df[df.ne(0).nunique(1).ne(1)].\
replace(0,np.nan).\
stack().\
reset_index(0).apply(tuple,1).\
groupby(level=0).apply(list).to_dict()
Out[497]:
{'fail': [('aa', 1.0), ('ab', 1.0), ('abc', 1.0)],
'success': [('aback', 1.0), ('abate', 1.0)]}
答案 3 :(得分:0)
您可以使用:
new_dict = {}
new_dict['fail'] = df[((df['fail']==1)&(df['success']==0))]['fail'].reset_index().values.tolist()
new_dict['success'] = df[((df['fail']==0)&(df['success']==1))]['success'].reset_index().values.tolist()
输出:
{'fail': [['aa', 1], ['ab', 1], ['abc', 1]], 'success': [['aback', 1], ['abate', 1]]}