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
我有一個熊貓數據框,看起來像這樣以「道」爲列標題中的所有列比較列:如何在大熊貓數據幀
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
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
定時
下面的代碼
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)
替代解決方案(但這需要唯一值)。
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
這隻能如果每個列是唯一。讓我知道如果你改正這一點,我會刪除評論。 – piRSquared
@piRSquared是的我意識到這一點,這就是爲什麼我把它放在括號內。我提出這個答案是因爲它的簡單性(易於理解)。但是,這是有限的。 –