如何在for循环中对dataframes进行逻辑运算?
How to perform logic operations on dataframes in for loops?
我有 4 个数据框,每个数据框都有一个连接它们的列 ID
我使用这行代码将所有 4 个合并为一个 df:
frame = [df1, df2, df3, df4]
df_final = reduce(lambda left,right: pd.merge(left,right,on='ID'), frame)
现在我想遍历 df_final
,但只针对 ID
等于 1 的地方,并将出现的行插入 API。
我创建了这段代码来尝试:
for i in df_final:
if df_final.loc[df_final['ID'] == 1]:
df_final_1 = df_final.loc[df_final['SID'] == 1]
data = {
'token': 'xxx',
'number': df_final_1.number,
'ID':df_final_1.ID + df_final.ID2,
'link':df_final_1.URL,
}
r = requests.post(url,headers=headers,params=data)
else:
print('fail')
我不断收到错误消息:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我知道它与循环中的这些代码行有关,但不确定是什么:
if df_final.loc[df_final['ID'] == 1]:
df_final_1 = df_final.loc[df_final['ID'] == 1]
理想情况下,我不想创建另一个数据框来保存我试图从 df_final
中提取的值
df_final.loc[df_final['ID'] == 1]
returns 包含 'ID' == 1
的行的 DataFrame
,不是布尔值。由于无论如何都会产生一个只包含您想要的行的框架,因此只需使用 itertuples()
:
对其进行迭代
for row in df_final[df_final['ID'] == 1].itertuples():
data = {
'token': 'xxx',
'number': row.number,
'ID':row.ID + row.ID2,
'link':row.URL,
}
r = requests.post(url,headers=headers,params=data)
我有 4 个数据框,每个数据框都有一个连接它们的列 ID
我使用这行代码将所有 4 个合并为一个 df:
frame = [df1, df2, df3, df4]
df_final = reduce(lambda left,right: pd.merge(left,right,on='ID'), frame)
现在我想遍历 df_final
,但只针对 ID
等于 1 的地方,并将出现的行插入 API。
我创建了这段代码来尝试:
for i in df_final:
if df_final.loc[df_final['ID'] == 1]:
df_final_1 = df_final.loc[df_final['SID'] == 1]
data = {
'token': 'xxx',
'number': df_final_1.number,
'ID':df_final_1.ID + df_final.ID2,
'link':df_final_1.URL,
}
r = requests.post(url,headers=headers,params=data)
else:
print('fail')
我不断收到错误消息:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我知道它与循环中的这些代码行有关,但不确定是什么:
if df_final.loc[df_final['ID'] == 1]:
df_final_1 = df_final.loc[df_final['ID'] == 1]
理想情况下,我不想创建另一个数据框来保存我试图从 df_final
df_final.loc[df_final['ID'] == 1]
returns 包含 'ID' == 1
的行的 DataFrame
,不是布尔值。由于无论如何都会产生一个只包含您想要的行的框架,因此只需使用 itertuples()
:
for row in df_final[df_final['ID'] == 1].itertuples():
data = {
'token': 'xxx',
'number': row.number,
'ID':row.ID + row.ID2,
'link':row.URL,
}
r = requests.post(url,headers=headers,params=data)