从数据帧中删除列,其中标头包含范围中的int

2024-09-24 00:33:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧df_alltrades,它有许多类似的列,其中字符串包括整数:

    instrument  Bid0Mkt  Bid1Mkt  Bid2Mkt  Bid3Mkt Bid4Mkt  ...
0   EURUSD      1.1      1.2      1.2      1.3     1.3
1   NZDUSD      0.6      0.65     0.7      0.9     0.92
.   .           .        .        .        .       
.   .           .        .        .        .       

我还为OfferXMkt设置了相应的列,并将许多其他列格式化为str

我想删除BidXMktOfferXMkt中的X大于0的任何列,这样我就可以得到如下结果:

     instrument  Bid0Mkt  Offer0Mkt ...
0    EURUSD      1.1      
1    NZDUSD      0.6      
.    .           .        
.    .           .            

我可以通过写出每个if语句来实现这一点

for column in df_alltrades.columns:
    if '1' in column:
        df_alltrades.drop(columns=column, inplace=True)
    if '2' in column:
        df_alltrades.drop(columns=column, inplace=True)
    if '3' in column:
        df_alltrades.drop(columns=column, inplace=True)
    if '4' in column:
        df_alltrades.drop(columns=column, inplace=True)

但我希望通过一个循环来清理它,比如:

for column in df_alltrades.columns:
    for C in range(1, 5):
        if C in column:
            df_alltrades.drop(columns=column, inplace=True)

但我得到了一个错误: TypeError: 'in <string>' requires string as left operand, not int

我也尝试过这样的事情

for X in range(1, 5):
    BidMkt = 'Bid{}Mkt'.format(X)

    df_new = df_alltrades.drop([BidMkt], axis = 1)

即使print(BidMkt)给出了完整的列表,也只会删除Bid4Mkt

谢谢你的帮助


Tags: columnsintruedfforifcolumndrop
3条回答

错误告诉您问题出在哪里C需要是字符串而不是整数:

   for column in df_alltrades.columns:
        for C in range(1, 5):
            if str(C) in column:
                df_alltrades.drop(columns=column, inplace=True)

但是如果我是你的话,我会先这样做以列表的形式获取标题

headers = list(df.columns.values)

从这个列表中过滤必要的列,然后使用它像这样分割数据帧

df = df[headers]

使用列表理解创建删除列表并删除这些列

d = {'instrument': {0: 'EURUSD', 1: 'NZDUSD'},
 'Bid0Mkt': {0: 1.1, 1: 0.6},
 'Bid1Mkt': {0: 1.2, 1: 0.65},
 'Bid2Mkt': {0: 1.2, 1: 0.7},
 'Bid3Mkt': {0: 1.3, 1: 0.9},
 'Bid4Mkt': {0: 1.3, 1: 0.92},
 'Another': {0: 1, 1: 2}}

df = pd.DataFrame(d)

remove = [col for col in df.columns if col.startswith('Bid') and int(col[3]) > 0]
new_df = df.drop(columns=remove)

  instrument  Bid0Mkt  Another
0     EURUSD      1.1        1
1     NZDUSD      0.6        2

检查哪些列中没有0:

for column in df_alltrades.columns:
    if 'Bid' in column and '0' not in column:
        df_alltrades.drop(columns=column, inplace=True)

相关问题 更多 >