提取pandas中的所有以下行

时间:2017-01-31 04:18:02

标签: python pandas dataframe

我有以下pandas DataFrame:

df

A B
1 b0
2 a0
3 c0
5 c1
6 a1
7 b1
8 b2

a开头的第一行是

df[df.B.str.startswith("a")]

A B
2 a0

我想提取B列中以a和后面的每一行开头的第一行。我想要的结果是

A B
2 a0
3 c0
5 c1
6 a1
7 b1
8 b2

如何做到这一点?

3 个答案:

答案 0 :(得分:3)

一种选择是创建一个遮罩并将其用于选择:

mask = df.B.str.startswith("a")
mask[~mask] = np.nan
df[mask.fillna(method='ffill').fillna(0).astype(int) == 1]

另一种选择是建立一个索引范围:

first = df[df.B.str.startswith("a")].index[0]
df.ix[first:]

后一种方法假定" a"永远存在。

答案 1 :(得分:2)

如果我理解你的问题,请按以下步骤操作:

df = pd.DataFrame(data={'A':[1,2,3,5,6,7,8],
      'B' : ['b0','a0','c0','c1','a1','b1','b2']})
# index of the item beginning with a
index = df[df.B.str.startswith("a")].values.tolist()[0][0] 
desired_df = pd.concat([df.A[index-1:],df.B[index-1:]], axis = 1)
print desired_df

你得到:

enter image description here

答案 2 :(得分:2)

使用idxmax查找第一个True

df.loc[df.B.str[0].eq('a').idxmax():]

   A   B
1  2  a0
2  3  c0
3  5  c1
4  6  a1
5  7  b1
6  8  b2