在熊猫列中满足条件时,返回另一列的值

时间:2020-06-29 17:10:12

标签: python pandas

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

我了解我需要在“交易数量”列中查找并找到<10的值,然后从该行返回交易ID,然后删除与交易ID匹配的行。

我知道这是错误的,但这是我以前的经历。

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

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

Trade Data

理想情况下,将更新数据框,以使其左侧只有Trade ID 487,我的代码对于后两行都没有问题,因为两者的交易量均低于10,但问题在于一个数量大于10阈值,其中一个低于阈值。请参见下图以获得所需的输出。 enter image description here

3 个答案:

答案 0 :(得分:2)

这不是很漂亮,但是我认为这可能会满足您的要求?删除只有一行具有相应交易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)

答案 1 :(得分:1)

这是使用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

答案 2 :(得分:0)

尝试一下

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

df = df[~df['Trade ID'].isin(unique_ids)]