【问题标题】:How to query python data frame against row of other data frame?如何针对其他数据框的行查询python数据框?
【发布时间】:2022-01-01 03:53:44
【问题描述】:

所以我有一个 100 行的数据框 (Df1)。我还有一个包含 1 行的数据框(df2)。对于每个数据框,一行代表一个属性。有问题的列是“NIY”和“购买价格”。我想编写一个查询 DF1 的函数,以显示 NIY 在 DF2 的 0.1 以内且购买价格在 DF2 的 2,000,000 以内的结果。

DF1 包含多个列,其中包含“NIY”和“购买价格”。

Purchase_Price NIY Purchaser
230000000 0.15 GS
30000000 0.08 JKK

见下方代码

df1 = pd.read_csv('CopyTransactions.csv', header=3)

df2 = {'Purchase_Price': [25300000], 'NIY': [0.078]}
df2 = pd.DataFrame(data=df2)
df1.query('Purchase_Price > 1000000 & NIY > 0.09')

df1.query('NIY within range g.0['NIY'] + or - 0.01 
     & Purchase_price within range g.0['Purchase_Price'] + or - 2,000,000)

代码一直工作到底部,我想弄清楚如何正确编码底部。 (底部代码中的 0 表示索引 0/第一行)

谢谢!

【问题讨论】:

  • “我也有一个包含 1 行的数据框 (df2)”,但 df2 这里有 2 行。此外,我们没有您的 csv 文件 'CopyTransactions.csv'。您正在查询名为df 的数据框,但未声明df。如果您需要帮助,您需要提供足够的代码和数据来重现您的问题
  • 接下来,我不会在您的列标题中添加空格。使用下划线。即df2 = {'Purchase_Price': [25300000, 34400000], 'NIY': [0.078, 0.11]}。这样,df2.query('Purchase_Price > 1000000 & NIY > 0.09') 就可以工作了
  • “我想编写一个函数来查询 DF1 以显示 NIY 在 DF2 的 0.1 范围内的结果”。那你为什么放+ or - 0.02
  • 谢谢,我会编辑的。本质上,我希望能够在一个范围内查询,而不是 > 或
  • 明白了。建立 df1 的小样本数据集(就像您为 df2 所做的那样)

标签: python pandas dataframe


【解决方案1】:

query,你可以试试:

>>> df1.query("@df2.Purchase_Price.iat[0]-2000000 <= Purchase_Price <= @df2.Purchase_Price.iat[0]+2000000 and @df2.NIY.iat[0]-0.1 <= NIY <= @df2.NIY.iat[0]+0.1")

   Purchase_Price   NIY Purchaser
2        23500000  0.08       FOO

【讨论】:

    【解决方案2】:

    这只是过滤/切片数据框的问题。

    我会将 df2 中的值存储为变量。然后可以使用pandas.between()

    import pandas as pd
    
    
    df1 = {'Purchase_Price': [23000000, 30000000, 26300000], 
           'NIY': [0.15, 0.08, 0.069],
           'Purchaser': ['GS','JKK','JJK']}
    df1 = pd.DataFrame(data=df1)
    
    df2 = {'Purchase_Price': [25300000], 'NIY': [0.078]}
    df2 = pd.DataFrame(data=df2)
    
    
    price_check = df2.iloc[0]['Purchase_Price']
    niy_check = df2.iloc[0]['NIY']
    
    price = 2000000
    niy = 0.01
    
    df = df1[(df1['Purchase_Price'].between(price_check - price, price_check + price)) 
         & (df1['NIY'].between(niy_check - niy, niy_check + niy))]
    

    输出:

    print(df)
    
       Purchase_Price    NIY Purchaser
    2        26300000  0.069       JJK
    

    在函数中:

    import pandas as pd
    
    
    def filter_df(df1, df_check, price_thresh, niy_thresh):
        price_check = df_check.iloc[0]['Purchase_Price']
        niy_check = df_check.iloc[0]['NIY']
        
        df = df1[(df1['Purchase_Price'].between(price_check - price_thresh, price_check + price_thresh)) 
         & (df1['NIY'].between(niy_check - niy_thresh, niy_check + niy_thresh))]
        
        return df
    
    df = {'Purchase_Price': [23000000, 30000000, 26300000], 
           'NIY': [0.15, 0.08, 0.069],
           'Purchaser': ['GS','JKK','JJK']}
    df = pd.DataFrame(data=df)
    
    df_check = {'Purchase_Price': [25300000], 'NIY': [0.078]}
    df_check = pd.DataFrame(data=df_check)
    
    
    new_df = filter_df(df, df_check, price_thresh=2000000, niy_thresh=0.01)
    

    【讨论】:

    • 太好了,谢谢!我不知道之间的功能。干杯
    猜你喜欢
    • 2019-06-26
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-02-22
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多