Python - 如何使用Pandas根据其他CSV编辑CSV

时间:2017-07-26 12:29:37

标签: python database excel pandas

我希望有人可以提供帮助。

我正处于需要根据另一个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这样慢的东西真的不是一个选项,任何想法?

1 个答案:

答案 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