首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何用数据帧将这些嵌套的for循环压缩成python的列表理解?

如何用数据帧将这些嵌套的for循环压缩成python的列表理解?
EN

Stack Overflow用户
提问于 2018-07-19 04:28:47
回答 2查看 197关注 0票数 1

我尝试从dataframe 1中一次取一行,并对照dataframe 2的所有行进行检查,然后根据条件更新dataframe 1中的另一列。

我使用嵌套的for循环实现了这一点,但是如何使用列表理解来简化这一点呢?

下面是一个使用嵌套for循环的工作原理的简化示例。它是这样做的:“如果df1中列c1的每个条目i小于df2的列d1中的每个条目,则更新df1的列c3:

代码语言:javascript
复制
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)

我已经使用以下类型的解决方案进行了类似的更新

代码语言:javascript
复制
df1.loc[*some condition which specifies the applicable rows of df1* eg df1["c1"] > df2["d1"], c3] = 1

但这只在df1和df2的行为1:1时有效,而且无论如何也不会将df1的每一行与df2的所有行进行比较。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-19 04:41:32

你需要用max(df2['d1'])检查df1['c1']中的每一项,以检查确保比较条件的""if every entry i of column c1 in df1 is less than every entry in column d1 of df2,"。相应地,将c3设置为1。考虑下面的代码。

代码语言:javascript
复制
df1.loc[df1['c1'] > max(df2['d1']), 'c3'] = 1

输出:

代码语言:javascript
复制
   c1   c3
0   1   0
1   3   0
2   10  1

注意:在for循环逻辑之后,输出与OP的df1匹配。

票数 1
EN

Stack Overflow用户

发布于 2018-07-19 04:49:13

我发现内部循环是多余的,因为修改最终依赖于df2的d1的最后一个值。如果我错了,请纠正我。

根据他的假设,我写下了这篇文章。

代码语言:javascript
复制
df1.c3=[0  if df1.loc[i, "c1"] < df2.loc[df2.index[-1], "d1"] else 1 for i in df1.index]   
print(df1)
print(df2)



   c1  c3
0   1   0
1   3   0
2  10   1
   d1
0   3
1   7
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51410486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档