我有以下数据框:
df = pd.DataFrame({'TX':['bob','tim','frank'],'IL':['fred','bob','tim'],'NE':['tim','joe','bob']})
我想隔离所有列中出现的字符串以生成列表。预期结果是:
output = ['tim','bob']
我能想到的唯一方法是使用我想避免的for循环。有内置的熊猫函数适合完成此任务吗?
答案 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']