python - 如何使用数据帧将这些嵌套的 for 循环压缩为 python 中的列表理解?

标签 python pandas dataframe iteration

我尝试从数据帧 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/

相关文章:

python-3.x - 如何总结 Pandas 数据框中每行的缺失值

python - 'Python' 创建类属性的方式是什么

python - 没有缩放 pixbuf 的缩放 PyGTK 图像

python - 将 JSON 数据映射到 Python 关键字参数

python - 在 Python 中启用 Unicode "globally"

python - Pandas 箱线图

python - Pandas 索引中值而不是值中值

python - Pandas 条件排名

python - 将 Pandas DataFrame 列表解包为单独的表格 DataFrame

dataframe - pyspark以减少/压缩的小文件数量写入配置单元表