我有两个 Dataframe ,df 1和df 2。
基于df1
中的条件day_of_week == 7
,我们必须匹配2个其他列值,(statWeek and statMonth)
如果条件匹配,那么我们必须将df 2中的as_cost_perf
替换为df 1中的cost_eu
。
下面是我使用iterrows()的代码块
如果我有一个很大 Dataframe ,那么它会很耗时,有人能帮我优化这个片段吗?
import pandas as pd
# create df1
data1 = {'day_of_week': [7, 7, 6],
'statWeek': [1, 2, 3],
'statMonth': [1, 1, 1],
'cost_eu': [957940.0, 942553.0, 1177088.0]}
df1 = pd.DataFrame(data1)
# create df2
data2 = {'statWeek': [1, 2, 3, 4, 1, 2, 3],
'statMonth': [1, 1, 1, 1, 2, 2, 2],
'as_cost_perf': [344560.0, 334580.0, 334523.0, 556760.0, 124660.0, 124660.0, 763660.0]}
df2 = pd.DataFrame(data2)
# identify rows in df1 where day_of_week == 7
mask = df1['day_of_week'] == 7
# update df2 with cost_eu from df1 where there is a match
for i, row in df1[mask].iterrows():
matching_rows = df2[(df2['statWeek'] == row['statWeek']) & (df2['statMonth'] == row['statMonth'])]
if not matching_rows.empty:
df2.loc[matching_rows.index, 'as_cost_perf'] = row['cost_eu']
# print the updated df2
df2
先谢了!
3条答案
按热度按时间agxfikkp1#
您可以重新格式化
df1
并将其与df2
连接,然后删除重复项:为了避免
drop_duplicates
,您可以简单地从df2
中删除相同的行:输出:
m0rkklqb2#
代替
for
循环,您可以使用单一重新分配应用df.merge
:qpgpyjmq3#
您可以使用
merge
或update
,但首先我们需要过滤器df1
,因为通过执行df1.loc[df1['day_of_week'].eq(7), 'statWeek':]
,您只关心day_of_week == 7
∮ ∮ ∮
∮ ∮ ∮