如何在你喜欢python的行之间删除更多行?

时间:2017-06-29 07:50:06

标签: python file pandas lines

我有一个奇怪的文件格式

###########################################################
# Name of file#
# stuff[hh:mm:ss:ms] stuff[num] stuff[num] stuff[] stuff[]#
###########################################################
00:00:00.000 -1000 -1000 0.000001 20
00:00:00.001 -1000 -1000 0.000001 20
00:00:00.002 -1000 -1000 0.000001 20
00:00:00.003 -1000 -1000 0.000001 20
00:00:00.004 -1000 -1000 0.000001 20
00:00:00.005 -1000 -1000 0.000001 20
00:00:00.006 -1000 -1000 0.000001 20
00:00:00.007 -1000 -1000 0.000001 20

问题是我每2秒只需要一次信息。这意味着我需要编辑其间的1999行。(空间实际上是/ t)这样做的最佳方法是什么。我还希望将数字保存为数字而不是字符串。

df = pd.read_csv('file.txt', sep="\t",
names=("time", "num1", "num2", "num3", "num4"), skiprows=4)
df["abs_time"] = df.index * 1e-3

我必须以不同的方式定义时间我已经有了代码,我只需要正确保存它。

def get_sec(time_str):
m, s, ss = time_str.split(':')
return int(m) * 60 + int(s) + 0.01*int(ss)

任何帮助都很受欢迎。

3 个答案:

答案 0 :(得分:1)

由于您需要每2秒钟一次数据,因此假设您没有丢失数据,则表示您需要有第二个,即偶数并以" 000"结束(您可以选择奇数秒) / p>

def is_select(time_str):
    return str.endswith(time_str, ".000") and int(time_str[6:8])%2
df['even_seconds'] = pd.apply(lambda x: is_select(x["time"]), axis=1)
select_data = df[df.even_seconds==True]

x["time"][6:8]会给你秒信息(你可以自己调整索引)。

当然,您可以修改lambda函数以进行其他数据选择。

答案 1 :(得分:1)

您可以使用skiprows参数来获取奇数行(或偶数)。来自文档:

  

如果是可调用的,则将针对该行评估可调用函数   如果行应该被跳过,则返回True,如果是,则返回False   除此以外。有效可调参数的一个例子是lambda x:   x在[0,2]中。

这里有一个csv示例:

#
#
#
#
A,B
1,1
2,2
3,3
4,4

然后你可以:

pd.read_csv('test.csv', skiprows=lambda x: True if x < 4 or x%2 == 1 else False)

输出:

   A  B
0  2  2
1  4  4

如您所见,您可以读取奇数或偶数行,因此每2秒只能获取一行。但请注意,这假定:

  1. 您正在使用最新的pandas版本0.20.2
  2. 您的数据是连续的,即每秒一行

答案 2 :(得分:0)

如果你的第一列中有字符串,你会收集毫秒并检查它们是否为模数2000。

vector_bool = df[df.columns[0]].apply(lambda x: x.split(".")[-1]).astype(int).cumsum().apply( lambda x: x%2000 == 0 )

然后只选择真实的那一行。

df_clean = df[vector_bool]