Python 获取数据帧列中系列中第一次出现的元素的索引

Python 获取数据帧列中系列中第一次出现的元素的索引,python,pandas,dataframe,Python,Pandas,Dataframe,考虑python数据帧 A B C 1 random imp1 2 random imp2 5 random imp3 1 yes --- 2 yes --- 3 no --- 4 no --- 5 yes --- 只要B列有一个值yes,我就要取a的值。最后,对于a

考虑python数据帧

A      B         C  
1      random    imp1  
2      random    imp2  
5      random    imp3   
1      yes       ---  
2      yes       ---   
3      no        ---   
4      no        ---  
5      yes       ---  
只要B列有一个值yes,我就要取a的值。最后,对于a的值,当这些值出现在a中的第一个时,我要取C。所以在本例中,我最后要取imp1、imp2和imp3

有没有一种优雅的方法可以做到这一点。

您可以先使用
loc
,然后再使用by值
a

a = df.loc[df['B'] == 'yes', 'A']
df = df.drop_duplicates('A')
df = df.loc[df['A'].isin(a), 'C']
print (df)
0    imp1
1    imp2
2    imp3
Name: C, dtype: object
计时

np.random.seed(123)
N = 1000000

df = pd.DataFrame({'B': np.random.choice(['yes','no', 'a', 'b', 'c'], N),
                   'A':np.random.randint(1000, size=N),
                   'C':np.random.randint(1000, size=N)})
print (df)

print (df[df.A.isin(df[df.B == 'yes'].A)].drop_duplicates('A').C)
print (df[df.A.isin(df[df.B == 'yes'].drop_duplicates('A').A)].C)

def fjez(df):
    a = df.loc[df['B'] == 'yes', 'A']
    df = df.drop_duplicates('A')
    return  df.loc[df['A'].isin(a), 'C']

def fpir(df):
    a = df.A.values
    b = df.B.values == 'yes'
    d = df.drop_duplicates('A')
    return d.C[np.in1d(d.A.values, a[b])]


print (fjez(df))
print (fpir(df))


让我们使用这一行:

df[df.A.isin(df[df.B == 'yes'].A)].drop_duplicates('A').C
输出:

0    imp1
1    imp2
2    imp3
Name: C, dtype: object

这应该很快

a = df.A.values
b = df.B.values == 'yes'
d = df.drop_duplicates('A')
d.C[np.in1d(d.A.values, a[b])]

0    imp1
1    imp2
2    imp3
Name: C, dtype: object

过度的方法。比我的其他方法快50%

from numba import njit

@njit
def proc(f, m):
    mx = f.max() + 1
    a = [False] * mx
    b = [0] * mx
    z = [0] * f.size

    for i in range(f.size):
        x = f[i]
        y = m[i]
        b[x] += 1
        z[i] = b[x]
        a[x] = a[x] or y

    return np.array(z) == 1, np.array(a)[f]

df.C[np.logical_and(*proc(pd.factorize(df.A.values)[0], df.B.values == 'yes'))]

0    imp1
1    imp2
2    imp3
Name: C, dtype: object

工作正常,在我的情况下不需要丢弃副本:)太好了,很高兴能帮上忙!你认为不需要在真实数据中删除重复项('A')吗?等等,对不起,这是需要的。抱歉弄糊涂了没问题;)我试着找到一些不需要的数据,但我找不到。@jezrael为什么它是添加额外翻译的列的点符号?@jezrael df[df.A.isin(df[df.B=='yes'])。删除重复项('A').A)]。C应该更好?
from numba import njit

@njit
def proc(f, m):
    mx = f.max() + 1
    a = [False] * mx
    b = [0] * mx
    z = [0] * f.size

    for i in range(f.size):
        x = f[i]
        y = m[i]
        b[x] += 1
        z[i] = b[x]
        a[x] = a[x] or y

    return np.array(z) == 1, np.array(a)[f]

df.C[np.logical_and(*proc(pd.factorize(df.A.values)[0], df.B.values == 'yes'))]

0    imp1
1    imp2
2    imp3
Name: C, dtype: object