我尝试从数据帧 1 中一次获取一行,并对照数据帧 2 的所有行进行检查,并根据条件更新数据帧 1 中的另一列。
我已经可以使用嵌套的 for 循环来实现这一点,但是如何通过列表理解来压缩它?
以下是使用嵌套 for 循环的简化示例。它正在执行“如果 df1 中 c1 列的每个条目 i 都小于 df2 d1 列中的每个条目,则更新 df1 的 c3 列:
import pandas as pd
import numpy as np
df1 = pd.DataFrame([{'c1': 1, 'c3': "0"}, {'c1': 3, 'c3': "0"}, {'c1': 10, 'c3': "0"}])
df2 = pd.DataFrame([{'d1': 3}, {'d1': 7}])
print(df1)
print(df2)
for i in df1.index:
for j in df2.index:
if df1.loc[i, "c1"] < df2.loc[j, "d1"]:
df1.loc[i, "c3"] = 0
else:
df1.loc[i, "c3"] = 1
print(df1)
print(df2)
我已经使用类型的解决方案完成了类似的更新
df1.loc[*some condition which specifies the applicable rows of df1* eg df1["c1"] > df2["d1"], c3] = 1
但这仅在 df1 和 df2 的行为 1:1 时才有效,并且无论如何都不会将 df1 的每一行与 df2 的所有行进行比较。
谢谢!
最佳答案
您需要使用 max(df2['d1'])
检查 df1['c1']
中的每个条目,以检查 ""if every df1 中 c1 列的条目 i 小于 df2 d1 列中的每个条目,”
这将确保比较条件。因此,将 c3
设置为 1
。考虑下面的代码。
df1.loc[df1['c1'] > max(df2['d1']), 'c3'] = 1
输出:
c1 c3
0 1 0
1 3 0
2 10 1
注意:for循环逻辑后的输出与OP的df1
匹配。
关于python - 如何使用数据帧将这些嵌套的 for 循环压缩为 python 中的列表理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51410486/