Python - 如何使用 Pandas 编辑基于另一个 CSV 的 CSV



我希望有人能帮忙。

我的情况是我需要根据另一个 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

相关内容

最新更新