按行切片 Pandas DataFrame

Posted

技术标签:

【中文标题】按行切片 Pandas DataFrame【英文标题】:Slice Pandas DataFrame by Row 【发布时间】:2012-08-06 13:05:49 【问题描述】:

我正在处理通过 pandas 包从 h5 文件以 hdf = pandas.HDFStore('Survey.h5') 加载的调查数据。在此DataFrame 中,所有行都是单个调查的结果,而列是单个调查中所有问题的答案。

我的目标是将此数据集减少到更小的DataFrame,仅包括在某个问题上具有特定描述答案的行,即此列中的所有值都相同。我能够在此条件下确定所有行的索引值,但我找不到如何删除这些行或仅使用这些行创建一个新的 df。

【问题讨论】:

【参考方案1】:

如果你已经知道索引可以使用.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

【讨论】:

值得注意的是,尽管df.loc[1:3]some_list[1:3] 之间的符号相似,但第一个使用包含上索引,而第二个(和大多数python)使用独占上索引。 【参考方案2】:
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))] 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))]

以上是关于按行切片 Pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

pandas读取txt---按行输入按行输出

14.pandas里面按条件筛选

pandas高级用法

python--pandas合并与连接

Pandas:按行从 DataFrame 的特定列中选择值

Pandas - 检查列表列中的字符串列是不是按行排列