我在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值。
你能帮我吗?
谢谢
答案 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?