【问题标题】:Filtering data with pandas使用 pandas 过滤数据
【发布时间】:2013-09-29 12:45:36
【问题描述】:

我是 Pandas 的新手,我正在尝试将它应用到我已经编写的脚本中。 我有一个 csv 文件,我从中提取数据,并使用列 'candidate'、'final track' 和 'status'我的数据框。

我的问题是,我想过滤数据,可能使用 Wes Mckinney 的 10 分钟教程 ('http://nbviewer.ipython.org/urls/gist.github.com/wesm/4757075/raw/a72d3450ad4924d0e74fb57c9f62d1d895ea4574/PandasTour.ipynb') 中显示的方法。在In [80]: 部分,他使用aapl_bars.close_price['2009-10-15']

我想使用类似的方法来选择所有具有* 作为状态的数据。如果该行中没有 *,则其他列中的数据也会被删除。

我目前的代码

def establish_current_tacks(filename):

    df=pd.read_csv(filename)    
    cols=[df.iloc[:,0], df.iloc[:,10], df.iloc[:,11]]
    current_tracks=pd.concat(cols, axis=1)
    return current_tracks

我的数据框

>>> current_tracks
<class 'pandas.core.frame.DataFrame'>
Int64Index: 707 entries, 0 to 706
Data columns (total 3 columns):
candidate       695  non-null values
 final track    670  non-null values
 status         670  non-null values
dtypes: float64(1), object(2)

我想使用current_tracks.status['*']之类的东西,但这不起作用

抱歉,如果这很明显,我有点费力地理解它。

【问题讨论】:

  • 当您在读取 ​​csv 后过滤您的 cols 时,过滤对 read_csv 的调用会更有效,就像 df=read_csv(filename, usecols=[0,10,11]) 一样,或者您可以传递列名称列表 df=read_csv(filename, usecols=['candidate', 'final track', 'status'])它会加载得更快
  • 干杯埃德。我有两个问题,1. 您解释的 2 种方法不会产生相同的结果?(第一种给出了我想要的)。2.)您将如何使用列名索引这些列?
  • 我假设列名与您的输出相同,但可能它们不是,这可以解释 1. 第二个代码 sn-p 是正确的语法和形式,但由于某种原因是没有产生相同的结果,您需要了解原因,您可以阅读更多关于参数here

标签: python csv filter pandas


【解决方案1】:

由于您要过滤的数据不是数据框索引的一部分,而是常规列,因此您需要执行以下操作:

current_tracks[current_tracks.status == '*']

完整示例:

import pandas as pd
current_tracks = pd.DataFrame({'candidate': ['Bob', 'Jim', 'Alice'],
'final_track': [10, 15, 13], 'status': ['*', '.', '*']})
current_tracks
Out[3]: 
  candidate  final_track status
0       Bob           10      *
1       Jim           15      .
2     Alice           13      *

current_tracks[current_tracks.status == '*']
Out[4]: 
  candidate  final_track status
0       Bob           10      *
2     Alice           13      *

如果 status 是您的数据框索引的一部分,那么您的原始语法会起作用:

current_tracks = current_tracks.set_index('status')
current_tracks.candidate['*']
Out[8]: 
status
*           Bob
*         Alice
Name: candidate, dtype: object

【讨论】:

  • 谢谢@Marius 我正在尝试使用第二个set_index 部分。我收到错误KeyError: u'no item named status'
  • 查看您的 DataFrame,看起来 'status' 列实际上命名为 ' status' 并带有前导空格。也许你把它解析得很有趣?尝试显式重命名列 (current_tracks.columns = ['candidate', 'final_track', 'status']),看看它是否有效。
猜你喜欢
  • 2020-11-06
  • 2021-08-12
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 2017-03-08
  • 2018-06-07
相关资源
最近更新 更多