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
我有一个包含 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