现在我有数据框
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
但是,我无法想出下一步......
答案 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,和平伴侣!