python - 从 python pandas 中的 DataFrame 中删除特定行

标签 python pandas

我有一个很大的 .txt 文件,其中的数据格式不正确。我想删除一些行并将其余数据转换为 float 。我想删除带有 'X''XX' 的行,其余的我应该转换为 float,像 4;00.1 这样的数字应该被转换为 4.001 文件看起来像这个示例:

0,1,10/09/2012,3:01,4;09.1,5,6,7,8,9,10,11
1,-0.581586,11/09/2012,-1:93,0;20.3,739705,,0.892921,5,,6,7
2,XX,10/09/2012,3:04,4;76.0,0.183095,-0.057214,-0.504856,NaN,0.183095,12
3,-0.256051,10/09/2012,9:65,1;54.9,483293,0.504967,0.074442,-1.716287,7,0.504967,0.504967
4,-0.728092,11/09/2012,0:78,1;53.4,232247,4.556,0.328062,1.382914,NaN,4.556,4
5,4,11/09/2012,NaN,NaN,6.0008,NaN,NaN,NaN,6.000800,6.000000,6.000800
6,X,11/09/2012,X,X,5,X,8,2,1,17.000000,33.000000
7,,11/09/2012,,,,,,6.000000,5.000000,2.000000,2.000000
8,4,11/09/2012,7:98,3;04.5,5,6,3,7.000000,3.000000,3.000000,2
9,6,11/09/2012,2:21,4;67.2,5,2,2,7,3,8.000000,4.000000

我将它读取到 DataFrame 并选择行

from pandas import *
from csv import *
fileName = '~/data.txt'
colName = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
df = DataFrame(read_csv(fileName, names=colName))
print df[df['b'].isin(['X','XX',None,'NaN'])].to_string()

最后一行的输出只给我:

>>> print df[df['b'].isin(['X','XX',None,'NaN'])].to_string()
    b           c     d       e         f          g         h   i         j   k   l
a                                                                                   
2  XX  10/09/2012  3:04  4;76.0  0.183095  -0.057214 -0.504856 NaN  0.183095  12 NaN
6   X  11/09/2012     X       X  5.000000          X  8.000000   2  1.000000  17  33

不选择第 7 行,我想遍历所有 df 而不仅仅是一列(原始文件非常大)。

目前我使用如下方式进行转换,但需要先删除不需要的行才能将其应用于所有 df。

convert1 = lambda x : x.replace('.', '')
convert2 = lambda x : float(x.replace(';', '.'))
newNumber = convert2(convert1(df['e'][0])) 

选择行后我想从 df 中删除它们,我尝试 df.pop() 但它只适用于列而不适用于行。我尝试命名行,但运气不好。在这个特定的 .txt 中,我应该以行 [0,3,8,9] 中的新 df 结束,其中“c”列作为日期格式,“d”作为时间格式,其余为 float 。我现在已经尝试弄清楚了很长一段时间,但不知道该移动到哪里,是否可以在 pandas 中使用(可能应该是)或者我是否需要更改为 ndarray 或其他任何东西?谢谢你的建议

最佳答案

您的原始过滤器的问题是它检查“NaN”而不是 numpy.nan,这是默认情况下解析空字符串的内容。 如果您想过滤所有列,以便只获取没有元素为“X”或“XX”的行,请执行以下操作:

In [45]: names = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']

In [46]: df = pd.read_csv(StringIO(data), header=None, names=names)

In [47]: mask = df.applymap(lambda x: x in ['X', 'XX', None, np.nan])

In [48]: df[-mask.any(axis=1)]
Out[48]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 0 to 9
Data columns:
a    5  non-null values
b    5  non-null values
c    5  non-null values
d    5  non-null values
e    5  non-null values
f    5  non-null values
g    5  non-null values
h    5  non-null values
i    5  non-null values
j    4  non-null values
k    5  non-null values
l    5  non-null values
dtypes: float64(6), int64(1), object(5)

关于python - 从 python pandas 中的 DataFrame 中删除特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12548349/

相关文章:

python - 如何从Python中的顺序变量创建数字类别?

python - 使用 Python 多处理更新共享只读数据

python - 如何通过代理使用 Boto3 S3 连接?

python - 在 pandas DataFrame 中保留每组的最后 N 条记录

python - 如何覆盖所有模板的 flask_admin 样式?

python - 从数据帧中删除一些行后如何循环遍历数据帧?

python-2.7 - 获取与列中最大值关联的行数据(Python/Pandas)

python - 将 pandas 分组列转换为字符串时出错

python - Pandas 嵌套的 groupby 给出了意想不到的结果

python - Pandas:取消堆叠 DataFrame 的一列