基于pandas DataFrame的条件查询

3

假设有三个 pandas.DataFrame,分别为 df1df2df3,它们的结构相同,但数值不同。我想执行以下操作:

res=if df1>1.0: (df2-df3)/(df1-1) else df3

res 应该与 df1df2df3 具有相同的结构。

numpy.where() 生成的结果是一个扁平数组。

编辑 1:

res 应该与 df1df2df3 具有相同的索引。

例如,我可以通过 df2["instanceA"]["parameter1"]["paramter2"] 访问 df2。我希望通过 res["instanceA"]["parameter1"]["paramter2"] 访问新计算的 DataFrame/Series res

3个回答

2

实际上,numpy.where 应该可以很好地处理这个问题。输出结果是4x2(与df1、df2、df3相同)。

df1 = pd.DataFrame( np.random.randn(4,2), columns=list('xy') )
df2 = pd.DataFrame( np.random.randn(4,2), columns=list('xy') )
df3 = pd.DataFrame( np.random.randn(4,2), columns=list('xy') )

res = df3.copy()
res[:] = np.where( df1 > 1, (df2-df3)/(df1-1), df3 )

          x         y
0 -0.671787 -0.445276
1 -0.609351 -0.881987
2  0.324390  1.222632
3 -0.138606  0.955993

请注意,这适用于系列和数据帧。 [:] 是切片语法,它保留索引和列。如果没有那个[:],结果将变成数组而不是系列或数据帧。
或者,对于系列,您可以按照@Kadir在他的答案中所做的方式编写:
res = pd.Series(np.where( df1>1, (df2-df3)/(df1-1), df3 ), index=df1.index)

或者对于数据框,您可以编写:

res = pd.DataFrame(np.where( df1>1, (df2-df3)/(df1-1), df3 ), index=df1.index,
                                                              columns=df1.columns)

1

this question中的想法与JohnE的回答结合起来,我得出了以下解决方案:

res = pd.Series(np.where( df1 > 1, (df2-df3)/(df1-1), df3 ), index=df1.index)

希望能提供使用数据框的更好答案。


0

假设df是您的初始数据框架,res是新列。使用设置值和布尔索引的组合。

将res设置为df3的副本:

 df['res'] = df['df3']

然后根据您的条件调整值。

df[df['df1']>1.0]['res'] = (df['df2'] - df['df3'])/(df['df1']-1)

2
我相信df1/df2/df3应该是数据框,而不是列。 - JohnE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接