【发布时间】:2018-05-16 00:21:50
【问题描述】:
我有一个数据框df,其中有一列很长的随机正整数:
df = pd.DataFrame({'n': np.random.randint(1, 10, size = 10000)})
我想确定列中第一个偶数的索引。一种方法是:
df[df.n % 2 == 0].iloc[0]
但这涉及很多操作(生成索引f.n % 2 == 0,在这些索引上评估df,最后取第一项)并且非常慢。这样的循环要快得多:
for j in range(len(df)):
if df.n.iloc[j] % 2 == 0:
break
还因为第一个结果可能在前几行。有没有类似性能的熊猫方法?谢谢。
注意:此条件(为偶数)只是一个示例。 我正在寻找一种适用于值的任何类型条件的解决方案,即,一种快速的单行替代方案:
df[ conditions on df.n ].iloc[0]
【问题讨论】:
-
你为什么不直接使用那个循环呢?
-
列是否已排序?如果是这样,您可以尝试
np.searchsorted。如果没有,除了预排序,我认为没有任何矢量化解决方案。 -
@RNar:我正在学习熊猫,我想知道如何在熊猫中做到这一点@ayhan:是的,该列已排序。但是如何使用
np.searchsorted指定复杂条件?例如,如何找到第一个偶数? -
如果你说的前几行通常满足条件,那么你可以做
df.iloc[:x,df.A > 3.5].iloc[0]只搜索前X行。如果错过了,请搜索下 X 行等。根据您的数据和应该快速的 X 选择。否则我可能会在 ayhan 链接的答案之一中尝试 numba 函数 -
归根结底,
conditions on df.n是一个非常 广泛的问题,并且根据具体情况有不同的操作。无论如何,要摆脱与系列/列的元素比较是很困难的。.iloc[0]或其他任何你在最后添加的东西都不是昂贵的部分。