2017-08-14 232 views
1

我有一个熊猫数据框,看起来像这样以“道”为列标题中的所有列比较列:如何在大熊猫数据帧

Word Word Word Word 
0 Nap  Nap  Nap  Cat 
1 Cat  Cat  Cat  Flower 
2 Peace Kick Kick Go 
3 Phone Fin  Fin  Nap 

如何只能返回出现在所有的话4列?

预期输出:

Word 
0 Nap 
1 Cat 

回答

2
  • 使用apply(set)把每一列成一组词
  • 使用set.intersection的找到所有单词中的每一列的设置
  • 把它变成一个列表,然后一系列

pd.Series(list(set.intersection(*df.apply(set)))) 

0 Cat 
1 Nap 
dtype: object 

我们可以用一些python函数来实现同样的任务,以获得一些性能上的好处。

pd.Series(list(
    set.intersection(*map(set, map(lambda c: df[c].values.tolist(), df))) 
)) 

0 Cat 
1 Nap 
dtype: object 

定时
下面的代码

enter image description here

pir1 = lambda d: pd.Series(list(set.intersection(*d.apply(set)))) 
pir2 = lambda d: pd.Series(list(set.intersection(*map(set, map(lambda c: d[c].values.tolist(), d))))) 
# I took some liberties with @Anton vBR's solution. 
vbr = lambda d: pd.Series((lambda x: x.index[x.values == len(d.columns)])(pd.value_counts(d.values.ravel()))) 

results = pd.DataFrame(
    index=pd.Index([10, 30, 100, 300, 1000, 3000, 10000, 30000]), 
    columns='pir1 pir2 vbr'.split() 
) 

for i in results.index: 
    d = pd.concat(dict(enumerate(
     [pd.Series(np.random.choice(words[:i*2], i, False)) for _ in range(4)] 
    )), axis=1) 
    for j in results.columns: 
     stmt = '{}(d)'.format(j) 
     setp = 'from __main__ import d, {}'.format(j) 
     results.set_value(i, j, timeit(stmt, setp, number=100)) 

results.plot(loglog=True) 
1

替代解决方案(但这需要唯一值)。

tf = df.stack().value_counts() 
df2 = pd.DataFrame(pd.Series(tf)).reset_index() 
df2.columns = ["word", "count"] 

    word count 
0 Nap  4 
1 Cat  4 
2 Fin  2 
3 Kick 2 
4 Go  1 
5 Phone 1 
6 Peace 1 
7 Flower 1 

这可以用DF2 [DF2 [ “计数”] == LEN(df.columns)] [ “字”]进行滤波

0 Nap 
1 Cat 
Name: word, dtype: object 
+0

这只能如果每个列是唯一。让我知道如果你改正这一点,我会删除评论。 – piRSquared

+0

@piRSquared是的我意识到这一点,这就是为什么我把它放在括号内。我提出这个答案是因为它的简单性(易于理解)。但是,这是有限的。 –