我希望有人可以提供帮助。
我正处于需要根据另一个CSV从一个CSV文件中删除行的情况。考虑这个简单的例子:
Time Some Column
4/25/2016 06:20:00 A
4/25/2016 06:20:01 B
4/25/2016 06:20:02 B
4/25/2016 06:20:03 B
4/25/2016 06:20:04 A
4/25/2016 06:20:05 A
然后我有另一个档案:
Time Block
4/25/2016 06:20:00 Block B for 10 seconds
我应该能够使用第二个文件并将其读入我的程序,以便在6:20:00之后删除'Some Column'中带有'B'的任何行10秒,所以实际上,我需要一些功能来查看第一个和第二个CSV文件并为我生成:
Time Some Column
4/25/2016 06:20:00 A
4/25/2016 06:20:04 A
4/25/2016 06:20:05 A
请注意,我正在处理的CSV有超过300万行,所以使用像openpyxl这样慢的东西真的不是一个选项,任何想法?
答案 0 :(得分:1)
你可以这样做的一种方法是使用pd.merge_asof
来帮助10秒间隔。将这两个文件合并在Time
上,tolarance
等于pd.Timedelta(10, unit='s')
过滤文件1,仅限于' B'。从file1中删除从merge_asof返回的那些记录。
from io import StringIO
csv_file1 = StringIO("""Time Some Column
4/25/2016 06:20:00 A
4/25/2016 06:20:01 B
4/25/2016 06:20:02 B
4/25/2016 06:20:03 B
4/25/2016 06:20:04 A
4/25/2016 06:20:05 A""")
csv_file2 = StringIO("""Time Block
4/25/2016 06:20:00 Block B for 10 seconds""")
df1 = pd.read_csv(csv_file1, sep='\s\s+', index_col='Time', engine='python', parse_dates=True)
df2 = pd.read_csv(csv_file2, sep='\s\s+', index_col='Time', engine='python', parse_dates=True)
df_out = (df1.drop(pd.merge_asof(df1[df1['Some Column'] == 'B'],
df2,
right_index=True,
left_index=True,
tolerance=pd.Timedelta(10, unit='s')).index))
print(df_out.reset_index())
输出:
Time Some Column
0 2016-04-25 06:20:00 A
1 2016-04-25 06:20:04 A
2 2016-04-25 06:20:05 A