按名称列表对Pandas中的多个列进行切片

发布于 2021-01-29 18:20:11

我正在尝试通过两种不同的方法在Pandas数据框中选择多个列:

1)通过列号,例如1-3列和6列起。

2)通过列名列表,例如:

years = list(range(2000,2017))
months = list(range(1,13))
years_month = list(["A", "B", "B"])
for y in years:
    for m in months:
        y_m = str(y) + "-" + str(m)
        years_month.append(y_m)

然后, years_month 将产生以下内容:

['A',
 'B',
 'C',
 '2000-1',
 '2000-2',
 '2000-3',
 '2000-4',
 '2000-5',
 '2000-6',
 '2000-7',
 '2000-8',
 '2000-9',
 '2000-10',
 '2000-11',
 '2000-12',
 '2001-1',
 '2001-2',
 '2001-3',
 '2001-4',
 '2001-5',
 '2001-6',
 '2001-7',
 '2001-8',
 '2001-9',
 '2001-10',
 '2001-11',
 '2001-12']

也就是说,在两种方法中,仅加载名称在 Years_month 列表中的列的最佳(或正确)方法是什么?

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我认为您需要numpy.r_合并列的位置,然后iloc用于选择:

    print (df.iloc[:, np.r_[1:3, 6:len(df.columns)]])
    

    对于第二种方法子集,通过list

    print (df[years_month])
    

    样品:

    df = pd.DataFrame({'2000-1':[1,3,5],
                       '2000-2':[5,3,6],
                       '2000-3':[7,8,9],
                       '2000-4':[1,3,5],
                       '2000-5':[5,3,6],
                       '2000-6':[7,8,9],
                       '2000-7':[1,3,5],
                       '2000-8':[5,3,6],
                       '2000-9':[7,4,3],
                       'A':[1,2,3],
                       'B':[4,5,6],
                       'C':[7,8,9]})
    
    print (df)
       2000-1  2000-2  2000-3  2000-4  2000-5  2000-6  2000-7  2000-8  2000-9  A  \
    0       1       5       7       1       5       7       1       5       7  1   
    1       3       3       8       3       3       8       3       3       4  2   
    2       5       6       9       5       6       9       5       6       3  3
    
       B  C  
    0  4  7  
    1  5  8  
    2  6  9
    
    print (df.iloc[:, np.r_[1:3, 6:len(df.columns)]])
       2000-2  2000-3  2000-7  2000-8  2000-9  A  B  C
    0       5       7       1       5       7  1  4  7
    1       3       8       3       3       4  2  5  8
    2       6       9       5       6       3  3  6  9
    

    您也可以总结的ranges(投来listpython 3是必要的):

    rng = list(range(1,3)) + list(range(6, len(df.columns)))
    print (rng)
    [1, 2, 6, 7, 8, 9, 10, 11]
    
    print (df.iloc[:, rng])
       2000-2  2000-3  2000-7  2000-8  2000-9  A  B  C
    0       5       7       1       5       7  1  4  7
    1       3       8       3       3       4  2  5  8
    2       6       9       5       6       3  3  6  9
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看