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



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

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.的列

我想删除BidXMktOfferXMktX大于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被丢弃。

谢谢你的帮助!

错误告诉您问题出在哪里。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]

检查哪些列中没有0:

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

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

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

最新更新