使用Pandas过滤掉特定列中的值

时间:2014-01-17 06:47:24

标签: python pandas

我想过滤某些包含字符串的行,而不是2个特定列的浮点数。

这是标题:

DATE,OPTION,SELL,BUY

这是我按照“选项”分组和编写数据以将其拆分为较小的csv文件的方式:

grouped = df.groupby('OPTION')

for name, group in grouped:
    group.to_csv(name+'.csv')

SELL和BUY列主要包含浮点数,但在极少数情况下它们包含字符串。 我如何过滤掉这些行,以便在SELL和BUY列中只编写没有字符串的新csv?

提前致谢,


修改

到目前为止,答案似乎没有摆脱坏的价值,但我感觉可能是因为数据本身(包含字符串中的数字,这里是实际数据的一小部分样本) )

DATE,OPTION,SELL,BUY
2014-01-14 11:01:02.168146,Asx 200 [232],Asx 200 [112],47.7
2014-01-14 11:01:02.868105,Asx 200 [232],Asx 200 [112],47.8
2014-01-14 11:01:03.566983,Asx 200 [232],40.5,49.1
2014-01-14 11:01:04.279423,Asx 200 [232],40.5,49.0

我希望输出csv只是:

DATE,OPTION,SELL,BUY
2014-01-14 11:01:03.566983,Asx 200 [232],40.5,49.1
2014-01-14 11:01:04.279423,Asx 200 [232],40.5,49.0

由于 Asx 200 [112] 出现在卖出栏中。

3 个答案:

答案 0 :(得分:3)

如果您的数据没有NaN,则可以使用convert_objects

import pandas as pd

x = [1.0, 2.0, "a", 3.0]
y = ["b", 5.0, 3.0, 7.0]

df = pd.DataFrame({"x":x, "y":y})
df.convert_objects(convert_numeric=True).dropna()

如果您的数据中有NaN,请使用applymap

mask = df.applymap(lambda x:isinstance(x, float)).all(1)
df[mask]

修改

样本数据:

import pandas as pd
import io

txt = """DATE,OPTION,SELL,BUY
2014-01-14 11:01:02.168146,Asx 200 [232],Asx 200 [112],47.7
2014-01-14 11:01:02.868105,Asx 200 [232],Asx 200 [112],47.8
2014-01-14 11:01:03.566983,Asx 200 [232],40.5,49.1
2014-01-14 11:01:04.279423,Asx 200 [232],40.5,49.0"""

df = pd.read_csv(io.BytesIO(txt))

df[["SELL","BUY"]] = df[["SELL","BUY"]].convert_objects(convert_numeric=True)
df.dropna()

答案 1 :(得分:0)

更简单的选择是将特定的Series或整个DataFrame转换为数字。

示例

In [18]: df = pd.DataFrame({'a':[1,2,'c'], 'b':[2,3,4]})

In [19]: df
Out[19]: 
   a  b
0  1  2
1  2  3
2  c  4

转换为数字类型

In [20]: df  = df.convert_objects(convert_numeric=True)

In [21]: df
Out[21]: 
    a  b
0   1  2
1   2  3
2 NaN  4

删除NA

In [22]: df = df.dropna()

In [23]: df
Out[23]: 
   a  b
0  1  2
1  2  3

参考

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.convert_objects.html

答案 2 :(得分:0)

我想可能有更好的解决方案,但以下情况应该有效:

import pandas as pd
trade = pd.DataFrame({'BUY': [100.0, 'error', 200.0, 300.0], 'SELL': [50.0, 100.00, 'oops', 250.0]})
float_mask = trade.applymap(lambda x: type(x) == float)
trade[float_mask['BUY'] & float_mask['SELL'] ]

以下是数据的外观:

结果

     BUY     SELL
0    100     50
3    300     250

使用原始输入,交易:

     BUY     SELL
0    100     50
1    error   100
2    200     oops
3    300     250

希望出现更好的解决方案。