Pandas WHERE子句用于字符串索引?

时间:2016-04-01 19:00:44

标签: python pandas

假设我有一个表ss_prices,其中有一个名为fund_code的主键列,pandas将其视为索引:

>>> arr = list(zip(['MM1', 'MM2', '3MM', '4AA'], range(1,5)))
>>> cols = ['fund_code', 'values']
>>> ss_prices = pd.DataFrame(arr, columns=cols).set_index('fund_code')
>>> ss_prices
              values
    fund_code
    MM1       1
    MM2       2
    3MM       3
    4AA       4

我想只获取主键以' MM'开头的那些行。在SQL中我可以这样做:

select * from ss_prices
where left(fund_code, 2) = 'MM'

但在pandas似乎我必须这样做:

ss_prices[np.vectorize(lambda x: x[:2] == 'MM')(ss_prices.index.values)]

pandas语法肯定更混乱,更不易读。如果没有使用像pandasql这样的工具,是否有更可读的方法来完成WHERE条款?

4 个答案:

答案 0 :(得分:2)

您可以使用DataFrame.filter使用正则表达式过滤索引:

~]# cat /etc/rsyslog.d/httpd-socket.conf
$AddUnixListenSocket /run/httpd-log0.sock
local0.* /var/log/httpd/mywsgiapp.log
& stop

~]# cat /etc/httpd/conf.d/00-myvhost.conf
<VirtualHost *:80>
  ServerName r72.example.com
  ServerAlias r72
  DocumentRoot /var/www/html
  CustomLog "|/usr/bin/logger -t httpd -u /run/httpd-log.sock -p local0.info" common
  ErrorLog "|/usr/bin/logger -t httpd -u /run/httpd-log.sock -p local0.error"
</VirtualHost>

答案 1 :(得分:1)

您可以使用x.startswith("MM")(您应该看到PEP 8)。

答案 2 :(得分:1)

尝试df.index.to_series().str[:2]

In [324]: df
Out[324]:
     a
MMa  1
MMb  2
AAA  3
BBB  4

In [325]: df[df.index.to_series().str[:2] == 'MM']
Out[325]:
     a
MMa  1
MMb  2

答案 3 :(得分:1)

直接在索引上使用str.startswith返回一个布尔掩码:

In [27]:
df[df.index.str.startswith('MM')]

Out[27]:
     a
MMa  1
MMb  2