我希望有人能帮忙。
我的情况是我需要根据另一个 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 之后删除"某列"中带有"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 这样慢的东西不是一个真正的选择,有什么想法吗?
您可以做到这一点的一种方法是使用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='ss+', index_col='Time', engine='python', parse_dates=True)
df2 = pd.read_csv(csv_file2, sep='ss+', 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