通过分割数据来优化嵌套for循环数据帧python

问题描述 投票:0回答:1

我想迭代某个列(index,F_Date)中的两个数据帧(df1,df2),我使用了

for i in df2.index:                 
               
    for j in df1.F_Date:

        A0=df2['X'][i]
        A1=df2['Y'][i]
        A1=df2['Z'][i]
        df1.loc[(df1['ID'] == A0) & 
       (df1['F_Date'] ==j ), 'Rule'] = 'A0 Occuar'
       df1.loc[(df1['ID'] == A1) & 
       (df1['F_Date'] ==j ), 'Rule'] = 'A1 Occuar'
       df1.loc[(df1['ID'] == A2) & 
       (df1['F_Date'] ==j ), 'Rule'] = 'A2 Occuar'          
        
                          

但是它进入了无限循环,我如何像尝试拆分数据时那样优化或拆分数据

split_df = np.array_split(df1, 20) 
for j in split_df.F_Date:

我收到错误:AttributeError:“列表”对象没有属性“F_Date”

示例 df1

身份证 F_日期 清除_日期
AB 2023-10-01 2023-10-02
CD 2023-10-02 2023-10-03
EF 2023-10-02 2023-10-04

df2

X Z
AB CD EF

我想迭代 df1 上的每一天和 df2 中的每一行,并检查 X、Y、Z 是否发生在该日期,然后如果发生则对此时间进行一些计算,输出将是最大值之间的时间差X、Y 的值和 Z 的时间。

python pandas for-loop
1个回答
0
投票

据我了解,您可能想要这样的东西:

import pandas as pd

#sample data
df1 = pd.DataFrame({'ID': ['AB','CD', 'EF'], 
                    'F_Date': ['2023-10-01', '2023-10-02', '2023-10-02'],
                    'Clear_Date': ['2023-10-02', '2023-10-03', '2023-10-04']})
df2 = pd.DataFrame({'X': ['AB'], 
                    'Y': ['CD'],
                    'Z': ['EF']})

df2 = df2.reset_index(names='rowid').melt(id_vars = 'rowid', value_vars = ['X','Y', 'Z'],var_name='Event', value_name='ID')


result = df1.merge(df2)

result.loc[result['Event'] == 'X', 'Event'] = 'A0 Occuar'
result.loc[result['Event'] == 'Y', 'Event'] = 'A1 Occuar'
result.loc[result['Event'] == 'Z', 'Event'] = 'A2 Occuar'

print(result)

这产生:

   ID      F_Date  Clear_Date  rowid      Event
0  AB  2023-10-01  2023-10-02      0  A0 Occuar
1  CD  2023-10-02  2023-10-03      0  A1 Occuar
2  EF  2023-10-02  2023-10-04      0  A2 Occuar

我使用

pd.melt
取消旋转第二个 df,然后您只需在 ID 上输入
pd.merge
即可获得答案。

© www.soinside.com 2019 - 2024. All rights reserved.