我想过滤某些包含字符串的行,而不是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] 出现在卖出栏中。
答案 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
希望出现更好的解决方案。