我尝试从dataframe 1中一次取一行,并对照dataframe 2的所有行进行检查,然后根据条件更新dataframe 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的所有行进行比较。
谢谢!
发布于 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
。考虑下面的代码。
df1.loc[df1['c1'] > max(df2['d1']), 'c3'] = 1
输出:
c1 c3
0 1 0
1 3 0
2 10 1
注意:在for循环逻辑之后,输出与OP的df1
匹配。
发布于 2018-07-19 04:49:13
我发现内部循环是多余的,因为修改最终依赖于df2的d1的最后一个值。如果我错了,请纠正我。
根据他的假设,我写下了这篇文章。
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
https://stackoverflow.com/questions/51410486
复制相似问题