我正在尝试实现一种更有效的方法,以返回等于特定值的pandas
df
的第一项和最后一项。我将在下面发布当前方法,但可能会有更有效的方法。
import pandas as pd
d = ({
'X' : ['X','Y','X','Z','X'],
'Y' : [2,5,3,5,1],
})
df = pd.DataFrame(data=d)
所以我想返回Y
在X == X
中的第一项和最后一项。
这是我的尝试,但我认为可能会有更有效的方法。
df = df[df['X'] == 'X']
df_first = df.drop_duplicates(subset=['X'], keep = 'first')
df_last = df.drop_duplicates(subset=['X'], keep = 'last')
df1 = pd.concat([df_first, df_last])
# my expected output
df1
X Y
0 X 2
4 X 1
答案 0 :(得分:3)
使用query
(实际上是任何选择方法)和iloc
,这应该很简单。
df.query('X == "X"').iloc[[0, -1]]
X Y
0 X 2
4 X 1
假定Y中没有NaN。否则,链dropna
:
df.query('X == "X"').dropna(subset=['Y']).iloc[[0, -1]]
X Y
0 X 2
4 X 1
另一个使用agg
的选项认为这很有趣。 如果您的“ Y”具有NaN,这将非常有用。
df.loc[df['Y'].where(df['X'] == 'X').agg(
['first_valid_index', 'last_valid_index'])]
X Y
0 X 2
4 X 1