Python pandas 计算与索引列完全匹配的列

Python pandas count exact match columns with index column

我有一个包含 0 和 1 的数据框

a   1 1 1 1 0 0 0 1 0 0 0 0 0
b   1 1 1 1 0 0 0 1 1 0 0 0 0
c   1 1 1 1 0 0 0 1 1 1 1 0 0
d   1 1 1 1 0 0 0 1 1 1 1 0 0
e   1 1 1 1 0 0 0 0 0 0 0 1 1
f   1 1 1 1 1 1 1 0 0 0 0 0 0

(没有header)

我想做一个函数,如果给定一个带有字符串的列表(行名),

输出将是与字符串完全匹配的列数

例如,

def exact_match(ls1):
  ~~~~~
  return col_num

print(exact_match(['c', 'd']))
>>> 2

输出为 2 因为

完全匹配的列只有两个。

问题不清楚,但是如果你想得到在提供的索引中只有 1 而在其他行中没有的列,你可以使用:

def exact_match(ls1):
    # 1s on the provided indices
    m1 = df.loc[ls1].eq(1).all()
    # no 1s in the other rows
    m2 = df.drop(ls1).ne(1).all()
    # slice and get shape
    return df.loc[:, m1&m2].shape[1]
    # or
    # return (m1&m2).sum()

print(exact_match(['c', 'd']))
# 2

如果我正确理解你的意思

并且,您的数据框类似于:

df = pd.DataFrame(data = [
    ["a", 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
    ["b", 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0],
    ["c", 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0],
    ["d", 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0],
    ["e", 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1],
    ["f", 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
])
df = df.rename(columns = {0:"name"}).set_index("name")

然后:

def exact_match(lst):
    s = df[df.columns[df.loc[lst].sum(axis = 0) == len(lst)]].sum(axis = 0) == len(lst)
    return len(s[s])
exact_match(["c","d"]) # output: 2