【问题标题】:When a condition is met in a pandas column return the value of another column当熊猫列中满足条件时,返回另一列的值
【发布时间】:2020-07-15 05:04:14
【问题描述】:

我有一个大约 1000 行的 pandas 数据框。这是适用于我的问题的虚构版本。如果我想在交易数量超过 10 时过滤掉交易 ID,这将留下单个交易 ID(例如第二个 523 会下降并留下第一个)。

我知道我需要查找交易数量列并找到小于 10 的值,然后从该行返回交易 ID,然后删除交易 ID 匹配的行。

我知道这是不正确的,但这是我以前的情况。

df.drop(df[df['Trade Quantity'] < 10], inplace =True

iloc 语句可以工作吗?并返回索引

理想情况下,数据框将被更新,使其左侧只有贸易 ID 487,我的代码对于最后两行没有问题,因为它们的贸易数量都低于 10,但问题在于一个数量高于阈值和一个低于。有关所需的输出,请参见下图。

【问题讨论】:

  • 欢迎来到 SO。你通常是在正确的方向。为了让其他人重现您的挑战并提出解决方案,您能否在您的问题中包含输入数据框作为文本 - 以及预期的输出?
  • 在你的情况下,drop 是多余的试试这个df[df['Trade Quantity'] &gt; 10]
  • 抱歉更新了这个问题,所以希望我想做什么更有意义!感谢您的帮助
  • 您希望所有行的交易 ID 都超过 10?
  • 是的,但不完全是,我的问题是您看到的第一行交易 ID 有一个超过 10 和一个低于 10。如果只有一侧超过 10,我希望删除交易 ID。跨度>

标签: python pandas


【解决方案1】:

它不漂亮,但我认为这可能会满足您的需求?删除只有一行具有相应交易 ID 的条目

df.drop(df[(df["Trade Quantity"] < 10)].index, inplace = True)

for each in set(df["Trade ID"]):
    if len(df[(df["Trade ID"]) == each]) < 2:
        df.drop(df[(df["Trade ID"] == each)].index, inplace = True)

【讨论】:

    【解决方案2】:

    试试这个,

    unique_ids = df.loc[df['Trade Quantity'] < 10, 'Trade ID'].unique()
    
    df = df[~df['Trade ID'].isin(unique_ids)]
    

    【讨论】:

    • 这个要df = df[~df['Trade ID'].isin(unique_ids)]
    【解决方案3】:

    这是使用 groupby / transform 的一种相当标准的方法:

    df = pd.DataFrame({"trade_id": [523, 523, 487, 487, 367, 367], 
                  "buy_or_sell": ["b", "s", "b", "s", "b", "s"], 
                  "quantity" : [15, 5, 13, 13, 4, 4]}) 
    
    df["min_quantity"] = df.groupby("trade_id")["quantity"].transform(min)
    df[df.min_quantity > 10]
    

    输出是:

       trade_id buy_or_sell  quantity  min_quantity
    2       487           b        13            13
    3       487           s        13            13
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-01
      • 2021-08-25
      • 2017-10-14
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多