A。我有一个数据框,其中顺序很重要。
import pandas as pd
inp = [{'c1':1,'c2':111123}, {'c1':2, 'c2':1001}, {'c1':3,'c2':11032}, {'c1':4,'c2':11044}, {'c1':5,'c2':11012}, {'c1':6, 'c2':100156}]
df = pd.DataFrame(inp)
print (df)
c1 c2
0 1 111123
1 2 1001
2 3 11032
3 4 11044
4 5 11012
5 6 100156
B。我想在该数据帧中搜索一个值,从该行返回一些值,然后根据该值的索引,我要搜索从该索引处开始的该数据帧的其余部分,并找到另一个值并执行相同的操作而忽略此索引之前发生的所有值
上述数据框的示例:
从c2列中查找值11032,在该索引处为c1打印值
从在c2列中找到11032的索引开始,从c2列中搜索11012,在该索引处为c1打印值
谢谢。
答案 0 :(得分:1)
使用1(==
)作为布尔掩码,并通过eq
获取第一个True
的第一个索引:
通知:
如果两个值都在“序列”中,则解决方案有效,第二个值在c2
中的第一个值之后。
a = df['c2'].eq(11032).idxmax()
print (a)
2
b = df.loc[a:, 'c2'].eq(11012).idxmax()
print (b)
4
通过带有theis索引的值返回元组列表的更一般的解决方案,如果没有第一个值匹配,则返回空列表。如果第二,第三...值不匹配,则仅返回所有匹配对:
def get_vals(vals):
out = []
idx = 0
for x in vals:
m = df.loc[idx:, 'c2'].eq(x)
if m.any():
idx = m.idxmax()
out.append((x, idx))
else:
return out
return out
print (get_vals([11032, 11012]))
[(11032, 2), (11012, 4)]
print (get_vals([10, 11012]))
[]
print (get_vals([11032, 10]))
[(11032, 2)]
print (get_vals([10, 11012, 100156]))
[]
print (get_vals([11032, 11012, 100156]))
[(11032, 2), (11012, 4), (100156, 5)]
print (get_vals([11032, 11012, 10]))
[(11032, 2), (11012, 4)]
print (get_vals([11032, 11012, 111123]))
[(11032, 2), (11012, 4)]
答案 1 :(得分:1)
编写一个通用搜索功能,该功能使用df.truncate
def search(df,val,prev_index):
df_tmp = df.truncate(before=prev_index)
idx = df.index[df['c2'] == val].tolist()[0]
return df.iloc[idx]['c1'],idx
现在
print(search(df,1001,0))
将返回
(2,1)
print(search(df,100156,1) #you can save idx values i.e. here 1 to a variable and reuse them !
将返回
(6,5)