Python Pandas使用多个条件进行筛选,并忽略包含子字符串重复项的条目

Python Pandas使用多个条件进行筛选,并忽略包含子字符串重复项的条目,python,pandas,Python,Pandas,我有一个数据框,它来自一个加密交易所的大量市场行情表。 该名单包括所有组合,但我只需要股票是对美元stablecoins 原始数据帧的前15个条目 Asset Price 0 1INCHBTC 0.00009650 1 1INCHBUSD 5.74340000 2 1INCHUSDT 5.74050000 3 AAVEBKRW 164167.00000000 4 AA

我有一个数据框,它来自一个加密交易所的大量市场行情表。 该名单包括所有组合,但我只需要股票是对美元stablecoins

原始数据帧的前15个条目

           Asset            Price
0   1INCHBTC      0.00009650     
1   1INCHBUSD     5.74340000     
2   1INCHUSDT     5.74050000     
3   AAVEBKRW      164167.00000000
4   AAVEBNB       0.77600000     
5   AAVEBTC       0.00615200     
6   AAVEBUSD      365.00200000   
7   AAVEDOWNUSDT  2.02505200     
8   AAVEETH       0.17212000     
9   AAVEUPUSDT    81.89500000    
10  AAVEUSDT      365.57600000   
11  ACMBTC        0.00018420     
12  ACMBUSD       10.91700000    
13  ACMUSDT       10.89500000    
14  ADAAUD        1.59600000     
           Asset         Price
0   1INCHBUSD     5.74340000  
1   1INCHUSDT     5.74050000  
2   AAVEBUSD      365.00200000
3   AAVEDOWNUSDT  2.02505200  
4   AAVEUPUSDT    81.89500000 
5   AAVEUSDT      365.57600000
6   ACMBUSD       10.91700000 
7   ACMUSDT       10.89500000 
8   ADABUSD       1.21439000  
9   ADADOWNUSDT   3.46482700  
10  ADATUSD       1.21284000  
11  ADAUPUSDT     76.12900000 
12  ADAUSDT       1.21394000  
13  AERGOBUSD     0.43012000  
14  AIONBUSD      0.07210000  
现在,有很多美元稳定币,但不是每个股票都有一对一对。 所以我使用了最流行的方法,以确保每个资产至少有一个匹配项

df = df.loc[(df.Asset.str[-3:] == 'DAI')|
            (df.Asset.str[-4:] == 'USDT')|
            (df.Asset.str[-4:] == 'BUSD')|
            (df.Asset.str[-4:] == 'TUSD')]
新但“混乱”数据帧的前15个条目

           Asset            Price
0   1INCHBTC      0.00009650     
1   1INCHBUSD     5.74340000     
2   1INCHUSDT     5.74050000     
3   AAVEBKRW      164167.00000000
4   AAVEBNB       0.77600000     
5   AAVEBTC       0.00615200     
6   AAVEBUSD      365.00200000   
7   AAVEDOWNUSDT  2.02505200     
8   AAVEETH       0.17212000     
9   AAVEUPUSDT    81.89500000    
10  AAVEUSDT      365.57600000   
11  ACMBTC        0.00018420     
12  ACMBUSD       10.91700000    
13  ACMUSDT       10.89500000    
14  ADAAUD        1.59600000     
           Asset         Price
0   1INCHBUSD     5.74340000  
1   1INCHUSDT     5.74050000  
2   AAVEBUSD      365.00200000
3   AAVEDOWNUSDT  2.02505200  
4   AAVEUPUSDT    81.89500000 
5   AAVEUSDT      365.57600000
6   ACMBUSD       10.91700000 
7   ACMUSDT       10.89500000 
8   ADABUSD       1.21439000  
9   ADADOWNUSDT   3.46482700  
10  ADATUSD       1.21284000  
11  ADAUPUSDT     76.12900000 
12  ADAUSDT       1.21394000  
13  AERGOBUSD     0.43012000  
14  AIONBUSD      0.07210000  
如何筛选/合并此数据帧中的条目,以便删除重复项? 我还需要在最后删除子字符串,所以我只剩下资产和美元价格

应该是这样的

           Asset         Price
0   1INCH         5.74340000  
2   AAVE          365.00200000
3   AAVEDOWN      2.02505200  
4   AAVEUP        81.89500000 
6   ACM           10.91700000 
8   ADA           1.21439000  
9   ADADOWN       3.46482700  
11  ADAUP         76.12900000 
13  AERGO         0.43012000  
14  AION          0.07210000 
这是一个投资组合跟踪。
另外,如果没有中间步骤,还有更好的方法,我洗耳恭听。

根据您的预期输出,您希望删除重复项,但首先保留项:

df.Asset = df.Asset.str.replace(r"(DAI|USDT|BUSD|TUSD)$", "")
df = df.drop_duplicates(subset="Asset", keep="first")
print(df)
印刷品:

资产价格
0 1英寸5.743400
2 AAVE 365.002000
3 AAVEDOWN 2.025502
4 AAVEUP 81.895000
6 ACM 10.917000
8 ADA 1.214390
9.3.464827
11.增加76129000
13阿尔戈0.430120
14 AION 0.072100

编辑:分组并平均:

df.Asset = df.Asset.str.replace(r"(DAI|USDT|BUSD|TUSD)$", "")
df = df.groupby("Asset")["Price"].mean().reset_index()
print(df)
印刷品:

资产价格
0 1英寸5.741950
1 AAVE 365.289000
2 AAVEDOWN 2.025502
3 AAVEUP 81.895000
4 ACM 10.906000
5 ADA 1.213723
6.3.464827
7.增加76129000
8阿尔戈0.430120
9 AION 0.072100
就这么做吧

con1 = df.Asset.str[-3:] == 'DAI'
con2 = df.Asset.str[-4:] == 'USDT'
con3 = df.Asset.str[-4:] == 'BUSD'
con4 = df.Asset.str[-4:] == 'TUSD'

df['new'] = np.select(['con1','con2','con3','con4'], 
                      ['DAI','USDT','BUSD','TUSD'])
out = df[con1 | con2 | con3 | con4].groupby('new').head(1)


在删除复制品时,您如何决定保留哪个
价格
?就像
1INCH
保持
BUSD
超过
USDT
对于这个用例来说并不重要,因为它是一个投资组合跟踪器,而且价格彼此非常接近……但是如果在它们之间取平均值,会更准确,但同样不需要。顺便问一下,有没有可能将它们平均化,而不是只保留第一个?虽然不需要它,但它更准确地表示了价格。@MegaDutcher请参见我的编辑。