python - 在循环内合并数据框 - 熊猫很慢
问题描述
我正在使用segmentMatch
发送两个数据帧的函数。我在一个数据帧中使用for
循环,并且在与另一个带有循环变量的数据帧合并之前要检查一些条件。它给了我完美的答案,但是因为两个数据框都太大了,所以太慢了。
有什么办法可以提高速度。
def segmentMatch(self, df, df_program):
df_result = []
for i, rview in df.iterrows():
df_tmp = []
df1 = []
df_tmp = df_program.ix[(df_program.iD == rview['id']) &
(rview['end_time'] >= df_program.START_TIME) &
(rview['start_time'] <= df_program.END_TIME)]
df1 = rview.to_frame().transpose()
tmp = pd.merge(df1, df_tmp,how='left')
df_result.append(tmp)
result = pd.concat(df_result, axis=0)
del(df1, df_tmp, tmp)
return result
请帮我。我正在使用 Visual Studio 代码和 Python 3.6
提前致谢。
解决方案
一般来说,如果可以避免,建议永远不要遍历数据框。merge
与任何or相比,循环非常慢join
。
条件连接在 pandas 中不是很好。然而,它们在 SQL 中非常简单。一个小的生命黑客可能是pip install pandasql
并实际使用 SQL。另请参见此处。以下示例未经测试。
import pandasql as ps
sqlcode = '''
SELECT *
FROM df
JOIN df ON 1=1
AND df_program.iD = df.id
AND df.end_time >= df_program.START_TIME
AND df.start_time <= df_program.END_TIME
'''
new_df = ps.sqldf(sqlcode, locals())
如果您不想使用pandassql
,我建议您稍后合并并检查条件。这当然需要更多的内存,具体取决于 ID 的重叠。同样,没有数据有点棘手,但类似于
full_df = df.join(df, on='id', rsuffix='program_')
filtered_df = df.loc[(df.end_time >= df.program_START_TIME) & (df.start_time <= df.program_END_TIME)
如果它不适合内存,您可以尝试对dask数据帧执行相同操作。
import dask.dataframe as dd
# Read your CSVs in like this
df = dd.read_csv('')
df_program = dd.read_csv('')
# Now make sure your ids are index in both dataframes
# Join and filter like above
full_df = df.join(df, on='id', rsuffix='program_')
filtered_df = df.loc[(df.end_time >= df.program_START_TIME) & (df.start_time <= df.program_END_TIME)
# Write the result to a CSV or convert to pandas (if it fits your memory anyway):
df = full_df.compute()
推荐阅读
- python - 我如何使用python在数据框中完全匹配
- swift - 单击设置为隐藏在 xcode 中的按钮会在隐藏之前在模拟器中留下一条细线
- php - 您如何在 WordPress 中正确过滤掉具有独特类别的自定义帖子类型?
- javascript - 如果 Firebase 登录成功,如何链接到下一页?
- javascript - 使用javascript将参数从视图传递给控制器
- android - android改造无法发送post请求
- android-studio - android.view.InflateException:
- c# - 如何在 C# 控制台窗口中显示泰米尔语文本“தமிழ்”?
- ios - TableView 不符合协议
- node.js - AWS Elastic beanstalk 请求突然开始失败