我有一个大约有1000行的pandas数据框。这是适用于我的问题的虚构版本。如果我想在交易数量超过10时过滤掉交易ID,则将留下单个交易ID(例如,第二个523将下降并保留第一个)。
我了解我需要在“交易数量”列中查找并找到<10的值,然后从该行返回交易ID,然后删除与交易ID匹配的行。
我知道这是错误的,但这是我以前的经历。
df.drop(df[df['Trade Quantity'] < 10], inplace =True
iloc语句可以工作吗?并返回索引
理想情况下,将更新数据框,以使其左侧只有Trade ID 487,我的代码对于后两行都没有问题,因为两者的交易量均低于10,但问题在于一个数量大于10阈值,其中一个低于阈值。请参见下图以获得所需的输出。
答案 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)]