从pandas中给定的单元格中获取行

时间:2017-04-13 08:58:16

标签: python pandas dataframe

我有一个数据框如下:

print(df.head(15))

     0     5     6      7     8       9
0  NaN  char  left  right   top  bottom
1    0     m    38    104  2456    2492
2    1     i    40    102  2442    2448
3    2     i    40    100  2402    2410
4    3     l    40    102  2372    2382
5    4     m    40    102  2312    2358
6    5     u    40    102  2292    2310
7    6     i    40    104  2210    2260
8    7     l    40    104  2180    2208
9    8     i    40    104  2140    2166
10   9     l    40    104  2124    2134
11  10     .   203    213   191     198
12  11     3   235    262   131     198
13  12     A   275    347   147     239
14  13     M   363    465   145     239

我想要检索给定单元格值的行。 例如,如果我给m我得到以下内容:

1    0     m    38    104  2456    2492
5    4     m    40    102  2312    2358

如果我给left=40right=102

我得

2    1     i    40    102  2442    2448
4    3     l    40    102  2372    2382
5    4     m    40    102  2312    2358
6    5     u    40    102  2292    2310

2 个答案:

答案 0 :(得分:1)

我认为您需要首先清理数据框 - 从第一行创建列,然后删除此行:

#columns from first row 
df.columns = df.iloc[0]
#remove 0 from column names
df.columns.name = None
#reove first row and first column, create default index (0,1,2,...)
df = df.iloc[1:, 1:].reset_index(drop=True)
cols = ['left','right','top','bottom']
#convert string columns to int
df[cols] = df[cols].astype(int)
print (df)
   char  left  right   top  bottom
0     m    38    104  2456    2492
1     i    40    102  2442    2448
2     i    40    100  2402    2410
3     l    40    102  2372    2382
4     m    40    102  2312    2358
5     u    40    102  2292    2310
6     i    40    104  2210    2260
7     l    40    104  2180    2208
8     i    40    104  2140    2166
9     l    40    104  2124    2134
10    .   203    213   191     198
11    3   235    262   131     198
12    A   275    347   147     239
13    M   363    465   145     239

然后使用boolean indexing

m = df[df['char'] == 'm']
print (m)
  char  left  right   top  bottom
0    m    38    104  2456    2492
4    m    40    102  2312    2358

df1 = df[(df['left'] == 40) & (df['right'] == 102)]
print (df1)
  char  left  right   top  bottom
1    i    40    102  2442    2448
3    l    40    102  2372    2382
4    m    40    102  2312    2358
5    u    40    102  2292    2310

但如果不需要数据清理:

m = df[df['5'] == 'm']
print (m)
     0  5   6    7     8     9
1  0.0  m  38  104  2456  2492
5  4.0  m  40  102  2312  2358

df1 = df[(df['6'] == '40') & (df['7'] == '102')]
print (df1)
     0  5   6    7     8     9
2  1.0  i  40  102  2442  2448
4  3.0  l  40  102  2372  2382
5  4.0  m  40  102  2312  2358
6  5.0  u  40  102  2292  2310

答案 1 :(得分:0)

df[df['char']=='m']
df[(df['left']==40) & (df['right']==102)]

编辑以包含缺少的开括号。感谢。