如何在pandas数据帧中提取垂直条件中的某些行

时间:2017-01-23 23:57:21

标签: python pandas dataframe

现在我有数据框

0000 0000 0000 0000 or'ed with
1111 1111 1100 0000
1111 1111 1100 0000 result

首先,我想提取df.B == 1

    A B C   
1   a 0 6  
1   b 1 5
1   c 0 8
1   d 0 9
2   e 0 1
2   f 1 2 
2   g 0 3
3   h 0 4
3   i 0 5
3   j 0 6

第二,我想提取C列数周围的行(+ -1,在这种情况下,行c 0 8在b 1 5旁边,但是df.C = 8的数量,所以这一列将被删除。如果df.C = 4或6,则会添加此行。无论它们是否彼此相邻都无关紧要。

   A B C
1  b 1 5
2  f 1 2

我想获得上面的数据框。我怎么能这样做?

首先我试过

  A B C
1 a 0 6
1 b 1 5
2 e 0 1
2 f 1 2
2 g 0 3

但是,我无法想出下一步......

2 个答案:

答案 0 :(得分:2)

# find where `B` is one
bs = np.where(df.B.values == 1)[0]

# union `bs` with + 1 and - 1
idx = np.unique(np.concatenate([bs - 1, bs, bs + 1]))

# don't go below zero or above last row
idx = idx[(0 <= idx) & (idx < len(df))]

# use `iloc` to index correct rows
df.iloc[idx]

   A  B  C
1  a  0  6
1  b  1  5
1  c  0  8
2  e  0  1
2  f  1  2
2  g  0  3

答案 1 :(得分:1)

好吧,这有点令人困惑(特别是因为你将数字从第一个例子改为第二个到第三个)但是从我所知道你想要获得所有行:

B==1

从那些行中,你想要获得具有相同索引值的行和来自B == 1的那个C的C + -1(如果我错了,请纠正我)

我会这样做的方式如下:

是df =原始数据框

DF = pd.DataFrame([], columns=['A','B','C'])

index_list = []

for i in np.arange(len(df)):

    ref_index = df.index[i]

    if df.iloc[i]['B'] == 1:

        DF.loc[len(DF)] = df.iloc[i]
        index_list.append(df.index[i])

    if df.iloc[i]['B'] == 0:

        try:

            ref_C = df[df['B']==1].loc[ df.index[i]]['C']

        except:

            ref_C = np.nan

        if ((df.iloc[i]['C'] == ref_C + 1)|(df.iloc[i]['C'] == ref_C - 1)):

        DF.loc[len(DF)] = df.iloc[i]
        index_list.append(df.index[i])            

DF.index = index_list

希望就是这样,如果有助于upvote / check answer,和平伴侣!