gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:34:08 24 4
gpt4 key购买 nike

我在 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 的值

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

你能帮我一下吗?

谢谢

最佳答案

如果始终存在至少一个C和一个P,则将p列转换为DataFrame.set_index索引,比较Series.eq对于 ==,通过切片 [::-1] 交换顺序并获取最后匹配的 CP条件:

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

指定 scp 值的通用解决方案:

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

详细信息:

首先按两个条件进行过滤,并通过 &loc 按位 AND 过滤列 p:

print (df.loc[df['cp'].eq('C') & df['s'].eq('a'), 'p'])
0 16
2 14
3 10
Name: p, dtype: int64

然后转换为 numpy 数组并使用 [::-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:

print (df.loc[df['cp'].eq('AAAA') & df['s'].eq('a'), 'p'])
Series([], Name: p, dtype: int64)

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

print (next(iter(df.loc[df['cp'].eq('AAA') & df['s'].eq('a'), 'p'].values[::-1]), 'no exist'))
no exist

关于python - 根据条件选择最后一行并将值存储到变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57936218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com