根据条件选择最后一行并将值存储到变量中

时间:2019-09-14 14:01:18

标签: python python-3.x pandas

我在python 3.7中的pandas中具有以下数据框,并读取excel。例如一个数据帧是

data = {'s':['a','a','a','a','b','b'],
        'cp':['C','P','C','C','C','P'],
        'st':[300,300,300,300,310,310],
         'qty':[3000,3000,3000,6000,9000,3000],
         'p':[16,15,14,10,8,12]}
df=pd.DataFrame(data)
df

    s   cp  st  qty p
0   a   C   300 3000    16
1   a   P   300 3000    15
2   a   C   300 3000    14
3   a   C   300 6000    10
4   b   C   310 9000    8
5   b   P   310 3000    12

我想将cp的最后一个值(即值“ p”列的“ s”列的“ cp”列的“ C”和“ P”)存储到变量中,例如条件“ s” = a的a和b变量是cp的最后一个值,其中cp ==“ C”为10,对于cp ==“ P”为15,则变量“ a”的值为10,变量“ b”的值为值为15。

对于“ s” ==“ b”,则a = 8和b = 12的值

我正在使用熊猫从另一个excel / csv文件读取s值。

你能帮我吗?

谢谢

2 个答案:

答案 0 :(得分:2)

如果始终存在至少一个C,并且将一个P的一个p列转换为DataFrame.set_index的索引,则用Series.eq比较{{1} },以切片==交换顺序,并根据条件获得最后匹配的[::-1]C

P

编辑:

a = df.set_index('p')['cp'].eq('C')[::-1].idxmax()
print (a)
8
b = df.set_index('p')['cp'].eq('P')[::-1].idxmax()
print (b)
12

df1 = df.drop_duplicates(['s','cp'], keep='last')[['s','cp','p']] print (df1) s cp p 1 a P 15 3 a C 10 4 b C 8 5 b P 12 s指定值的一般解决方案:

cp

详细信息

首先通过两个条件对过滤器列a = next(iter(df.loc[df['cp'].eq('C') & df['s'].eq('a'), 'p'].values[::-1]), 'no exist') print (a) 10 b = next(iter(df.loc[df['cp'].eq('P')& df['s'].eq('a'), 'p'].values[::-1]), 'no exist') print (b) 15 a = next(iter(df.loc[df['cp'].eq('C') & df['s'].eq('b'), 'p'].values[::-1]), 'no exist') print (a) 8 b = next(iter(df.loc[df['cp'].eq('P')& df['s'].eq('b'), 'p'].values[::-1]), 'no exist') print (b) 12 进行按位过滤,分别按AND&进行按位loc

p

然后转换为numpy数组并使用print (df.loc[df['cp'].eq('C') & df['s'].eq('a'), 'p']) 0 16 2 14 3 10 Name: p, dtype: int64 切片:

[::-1]

最后获得数组的第一个值:

print (df.loc[df['cp'].eq('C') & df['s'].eq('a'), 'p'].values[::-1])
[10 14 16]

如果测试不存在值,请在此处print (next(iter(df.loc[df['cp'].eq('C') & df['s'].eq('a'), 'p'].values[::-1]), 'no exist')) 10

AAA

答案 1 :(得分:0)

感谢@jezral

我从您的查询中得到答案

df[(df.s == "a")].set_index('p')['cp'].eq('C')[::-1].idxmax()
df[(df.s == "a")].set_index('p')['cp'].eq('P')[::-1].idxmax()

您能否解释[::-1]在做什么,并设置set_index?