给定以下数据框:
import pandas as pd
df=pd.DataFrame({'A':[0,4,4,4],
'B':[0,4,4,0],
'C':[0,4,4,4],
'D':[4,0,0,4],
'E':[4,0,0,0],
'Name':['a','a','b','c']})
df
A B C D E Name
0 0 0 0 4 4 a
1 4 4 4 0 0 a
2 4 4 4 0 0 b
3 4 0 4 4 0 c
我想添加一个名为“ Match_Flag”的新字段,如果它们具有互补的零模式(如行0、1和2)并且具有相同的名称(仅适用于行0和1),则该行将标记行的唯一组合。它使用匹配的行的名称。
预期结果如下:
A B C D E Name Match_Flag
0 0 0 0 4 4 a a
1 4 4 4 0 0 a a
2 4 4 4 0 0 b NaN
3 4 0 4 4 0 c NaN
注意:模式可能会有所不同,但仍应是互补的。
提前致谢!
更新
对困惑感到抱歉。这里有一些澄清:
第0行和第1行之所以是“互补的”,是因为它们在列中具有相反的零模式。0,0,0,4,4和4,4,4,0,0 数字4是任意的;它可以很容易地是0,0,0,4,2和65,770,23,0,0。因此,如果2个这样的行确实是互补的并且它们具有相同的名称,我希望在“ Match_Flag”列下将它们标记为相同的名称。
如果点乘积为零,并且元素明智的总和不为零,则可以识别出一个恭维。
def complements(df):
v = df.drop('Name', axis=1).values
n = v.shape[0]
row, col = np.triu_indices(n, 1)
# ensure two rows are complete
# their sum contains no zeros
c = ((v[row] + v[col]) != 0).all(1)
complete = set(row[c]).union(col[c])
# ensure two rows do not overlap
# their product is zero everywhere
o = (v[row] * v[col] == 0).all(1)
non_overlap = set(row[o]).union(col[o])
# we are a compliment iff we do
# not overlap and we are complete
complement = list(non_overlap.intersection(complete))
# return slice
return df.Name.iloc[complement]
然后groupby('Name')
,apply
我们的职能
df['Match_Flag'] = df.groupby('Name', group_keys=False).apply(complements)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句