按行切割Pandas数据帧

52

我正在使用pandas包中的pandas.HDFStore('Survey.h5')从h5文件加载的调查数据。在这个DataFrame中,所有行都是单个调查的结果,而列是单个调查中所有问题的答案。

我想将这个数据集减小到一个较小的DataFrame,只包括特定问题上呈现出某个特定答案的行,即该列中所有值相同的行。我能够确定具有此条件的所有行的索引值,但我找不到如何删除这些行或仅保留这些行创建一个新的df。

4个回答

51
In [36]: df
Out[36]:
   A  B  C  D
a  0  2  6  0
b  6  1  5  2
c  0  2  6  0
d  9  3  2  2

In [37]: rows
Out[37]: ['a', 'c']

In [38]: df.drop(rows)
Out[38]:
   A  B  C  D
b  6  1  5  2
d  9  3  2  2

In [39]: df[~((df.A == 0) & (df.B == 2) & (df.C == 6) & (df.D == 0))]
Out[39]:
   A  B  C  D
b  6  1  5  2
d  9  3  2  2

In [40]: df.ix[rows]
Out[40]:
   A  B  C  D
a  0  2  6  0
c  0  2  6  0

In [41]: df[((df.A == 0) & (df.B == 2) & (df.C == 6) & (df.D == 0))]
Out[41]:
   A  B  C  D
a  0  2  6  0
c  0  2  6  0

能否对数据框进行切片并且选出 (c = 5 或 c = 6) 的行,类似于这样:---> df[((df.A == 0) & (df.B == 2) & (df.C == 5 | 6) & (df.D == 0))] - yoshiserry
df[((df.A == 0) & (df.B == 2) & df.C.isin([5, 6]) & (df.D == 0))] 或者 df[((df.A == 0) & (df.B == 2) & ((df.C == 5) | (df.C == 6)) & (df.D == 0))] - Wouter Overmeire

26
如果您已经知道索引,可以使用.loc
In [12]: df = pd.DataFrame({"a": [1,2,3,4,5], "b": [4,5,6,7,8]})

In [13]: df
Out[13]:
   a  b
0  1  4
1  2  5
2  3  6
3  4  7
4  5  8

In [14]: df.loc[[0,2,4]]
Out[14]:
   a  b
0  1  4
2  3  6
4  5  8

In [15]: df.loc[1:3]
Out[15]:
   a  b
1  2  5
2  3  6
3  4  7

14
值得一提的是,尽管df.loc[1:3]some_list[1:3]在符号上很相似,但前者使用的是包含上限的索引方式,而后者(以及Python的大多数情况)使用的是不包含上限的索引方式。 - Phoenix Meadowlark

1

使用query来搜索特定条件:

In [3]: df
Out[3]: 
   age family   name
0    1      A   john 
1   36      A  jason 
2   32      A   jane 
3   26      B   jack 
4   30      B  james 

In [4]: df.query('age > 30 & family == "A"')
Out[4]: 
   age family   name
1   36      A  jason 
2   32      A   jane

查询后,我该如何切片列?例如,仅显示年龄和姓名。 - akalanka
1
嗨,如果你想使用query,可以尝试df.query('age > 30 & family == "A"')[['age', 'name']]。或者,你也可以使用locdf.loc[(df['age'] > 30) & (df['family'] == 'A'), ['age', 'name']] - rachwa

1
如果你只需要获取顶部的行,可以使用 `df.head(10)`。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接