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