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

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

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

【问题讨论】:

    标签: python pandas slice


    【解决方案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))]
    猜你喜欢
    • 2017-05-08
    • 2021-11-22
    • 2021-04-22
    • 2013-09-01
    • 2017-03-28
    • 2017-08-22
    • 2017-12-11
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多