如何删除你喜欢的行之间的更多行python?
How to delete more lines in between lines you like python?
我的文件格式很奇怪
###########################################################
# 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 行。(space 实际上是 /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)
非常感谢任何帮助。
由于您需要每 2 秒的数据,这将表明您需要有以“000”结尾的偶数秒(您也可以选择奇数秒)假设您没有丢失数据
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 函数。
您可以使用 skiprows
参数来获取奇数行(或偶数行)。来自文档:
If callable, the callable function will be evaluated against the row
indices, returning True if the row should be skipped and False
otherwise. An example of a valid callable argument would be lambda x:
x in [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 秒只读取一次行。但是请注意,这假设:
- 您正在使用最新的 pandas 版本 0.20.2
- 您的数据是连续的,即每秒一行
你对毫秒求和并检查它们是否以 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]
我的文件格式很奇怪
###########################################################
# 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 行。(space 实际上是 /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)
非常感谢任何帮助。
由于您需要每 2 秒的数据,这将表明您需要有以“000”结尾的偶数秒(您也可以选择奇数秒)假设您没有丢失数据
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 函数。
您可以使用 skiprows
参数来获取奇数行(或偶数行)。来自文档:
If callable, the callable function will be evaluated against the row indices, returning True if the row should be skipped and False otherwise. An example of a valid callable argument would be lambda x: x in [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 秒只读取一次行。但是请注意,这假设:
- 您正在使用最新的 pandas 版本 0.20.2
- 您的数据是连续的,即每秒一行
你对毫秒求和并检查它们是否以 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]