【发布时间】:2020-01-04 13:37:23
【问题描述】:
我正在尝试将 df2['values'] 中的列中的值分配给 df1['values'] 列。但是,只有在以下情况下才应分配值:
- df2['category'] 等于 df1['category'](行属于同一类别)
- df1['date'] 在 df2['date_range'] 中(日期在特定类别的特定范围内)
到目前为止,我有这段代码,它可以工作,但效率很低,因为我需要两天时间来处理两个 dfs(df1 有大约 700k 行)。
for i in df1.category.unique():
for j in df2.category.unique():
if i == j: # matching categories
for ia, ra in df1.loc[df1['category'] == i].iterrows():
for ib, rb in df2.loc[df2['category'] == j].iterrows():
if df1['date'][ia] in df2['date_range'][ib]:
df1.loc[ia, 'values'] = rb['values']
break
我读到我在处理数据帧时应该尽量避免使用 for 循环。列表推导很棒,但是由于我还没有很多经验,所以我很难编写更复杂的代码。
如何更有效地迭代这个问题?在迭代具有条件的数据帧时,我应该考虑哪些重要的关键方面?
上面的代码往往会跳过一些行或错误地分配它们,所以我需要在之后进行清理。最大的问题是它真的很慢。
谢谢。
一些 df1 见解:
df1.head()
date category
0 2015-01-07 f2
1 2015-01-26 f2
2 2015-01-26 f2
3 2015-04-08 f2
4 2015-04-10 f2
一些 df2 见解:
df2.date_range[0]
DatetimeIndex(['2011-11-02', '2011-11-03', '2011-11-04', '2011-11-05',
'2011-11-06', '2011-11-07', '2011-11-08', '2011-11-09',
'2011-11-10', '2011-11-11', '2011-11-12', '2011-11-13',
'2011-11-14', '2011-11-15', '2011-11-16', '2011-11-17',
'2011-11-18'],
dtype='datetime64[ns]', freq='D')
df2 其他两列:
df2[['values','category']].head()
values category
0 01 f1
1 02 f1
2 2.1 f1
3 2.2 f1
4 03 f1
【问题讨论】:
-
您能否详细说明
"date"和"date_range"的外观、它们的类型以及它们的格式? -
你能展示一些示例数据吗
-
@NaturalFrequency 我已经从两个数据帧中添加了一些数据样本
-
@aws_apprentice 我已经从两个数据帧中添加了一些数据样本
-
所以
df2['date_range']的每一行都是一个列表?
标签: python pandas loops dataframe