2017-08-14 234 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是的我意識到這一點,這就是爲什麼我把它放在括號內。我提出這個答案是因爲它的簡單性(易於理解)。但是,這是有限的。 –