繁体   English   中英

循环遍历一个pandas列以将值与另一个数据框的索引匹配

[英]Looping over one pandas column to match values with index of another dataframe

Exp是一个带有datetime object DataFrame

           Exp
0   1989-06-01
1   1989-07-01
2   1989-08-01
3   1989-09-01
4   1989-10-01

CL是具有Index作为DateTime Object的数据Dataframe

                    CL
1989-06-01   68.800026
1989-06-04   68.620026
1989-06-05   68.930023
1989-06-06   68.990021
1989-06-09   69.110023
  • 我想将新列R添加到CL数据框中,该数据将具有与CL索引匹配的Exp中的日期。

这是我想要的输出应该看起来像

                   CL          R

1989-06-01   68.800026   1989-06-01
1989-06-04   68.620026
1989-06-05   68.930023
1989-06-06   68.990021
1989-06-09   69.110023

这是我尝试做的:

for m in Exp.iloc[:,0]:
if m == CL.index:
    CL['R'] = m

ValueError:具有多个元素的数组的真值不明确。 使用a.any()或a.all()

有人可以帮帮我吗 ? 我多次收到此ValueError

编辑 :更新了评论者的建议。

您需要做LEFT JOIN:

Exp = pd.DataFrame(
    pd.to_datetime(['1989-06-01', '1989-07-01', '1989-08-01', '1989-09-01', '1989-10-01']),
    columns=['Exp'])

得到:

          Exp
0  1989-06-01
1  1989-07-01
2  1989-08-01
3  1989-09-01
4  1989-10-01

CL = pd.DataFrame(
[68.800026, 68.620026, 68.930023, 68.990021, 69.110023],
index = pd.to_datetime(['1989-06-01', '1989-06-04', '1989-06-05', '1989-06-06', '1989-06-09']),
columns = ['CL'])

                   CL
1989-06-01  68.800026
1989-06-04  68.620026
1989-06-05  68.930023
1989-06-06  68.990021
1989-06-09  69.110023

然后:

(CL
 .reset_index()
 .merge(Exp, how='left', right_on='Exp', left_on='index')
 .set_index('index')
 .rename(columns={'Exp': 'R'}))

返回您正在寻找的东西

                   CL           R
index                            
1989-06-01  68.800026  1989-06-01
1989-06-04  68.620026         NaN
1989-06-05  68.930023         NaN
1989-06-06  68.990021         NaN
1989-06-09  69.110023         NaN

因为遍历数据框不是熊猫的工作方式。

pd.DataFrame.join
join重点是通过索引组合数据框/系列。
Exp set_indexdrop=False一起使用,以使数据帧中的相同信息正确并保留索引。 我们将其放入索引中以方便join

CL.join(Exp.set_index('Exp', drop=False)).rename(columns=dict(Exp='R'))

                   CL          R
1989-06-01  68.800026 1989-06-01
1989-06-04  68.620026        NaT
1989-06-05  68.930023        NaT
1989-06-06  68.990021        NaT
1989-06-09  69.110023        NaT

设定

Exp = pd.DataFrame(dict(
        Exp=pd.to_datetime(
            ['1989-06-01', '1989-07-01', '1989-08-01', '1989-09-01', '1989-10-01'])
    ))

CL = pd.DataFrame(dict(
        CL=[68.800026, 68.620026, 68.930023, 68.990021, 69.110023],
    ), pd.to_datetime(
        ['1989-06-01', '1989-06-04', '1989-06-05', '1989-06-06', '1989-06-09']))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM