熊猫:跨栏查找共同的价值观

时间:2020-03-22 18:40:17

标签: python pandas dataframe

我有以下数据框:

df = pd.DataFrame({'TX':['bob','tim','frank'],'IL':['fred','bob','tim'],'NE':['tim','joe','bob']})

我想隔离所有列中出现的字符串以生成列表。预期结果是:

output = ['tim','bob']

我能想到的唯一方法是使用我想避免的for循环。有内置的熊猫函数适合完成此任务吗?

3 个答案:

答案 0 :(得分:3)

您可以为每列的计数值创建掩码,并通过DataFrame.all测试每行的缺失值:

m = df.apply(pd.value_counts).notna()
print (m)
          TX     IL     NE
bob     True   True   True
frank   True  False  False
fred   False   True  False
joe    False  False   True
tim     True   True   True

L = m.index[m.all(axis=1)].tolist()
print (L)
['bob', 'tim']

答案 1 :(得分:1)

IIUC,

您可以垂直堆叠所有列,然后执行value_counts来计算每一项的出现次数,我们将在名为s的变量中进行此操作

然后我们希望所有出现的名称都等于max的出现次数,在这种情况下3,由于使用了stack

,现在列值是索引
s = df.stack().value_counts()
# or if you want to ignore duplicates column wise
#df.stack().groupby(level=1).unique().explode().value_counts()

print(s)

tim      3
bob      3
frank    1
fred     1
joe      1

s1 = s[s.eq(s.max())].index.tolist()

print(s1)

['tim', 'bob']

答案 2 :(得分:1)

您可以通过pandas.DataFrame.apply()set.intersection()来实现,就像这样:

cols_set = list(df.apply(lambda col: set(col.values)).values)
output = list(set.intersection(*cols_set))

结果如下:

>>> print(output)
['tim', 'bob']