我有一个数据帧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.的列
我想删除BidXMkt
和OfferXMkt
中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
被丢弃。
谢谢你的帮助!
错误告诉您问题出在哪里。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