Pandas - 在 loc() 中指定切片 + 附加列标签

Pandas - Specify Slice + Additional Column Label in loc()

使用 loc 时,我似乎可以 指定一个带有单独列标签的列表 一个切片。

但是,我可以将切片与附加列标签组合在一起吗?如果可以,如何组合?

我试过了

games.loc[games.Platform.isin(['X360']),['Platform','NA_Sales':'Other_Sales']]

但这会引发语法错误...

使用:

#Preparing sample data
string = """A B C D
1 a a 1
1 a a 2
1 a a 3
2 a a 1
2 a a -1
3 a a -1
3 a a -2
3 a a -3"""


import numpy as np
data = [x.split() for x in string.split('\n')]
import pandas as pd
df = pd.DataFrame(np.array(data[1:]), columns = data[0])

# making a function to map col name to col index
c = df.columns
def indexer(col):
    return c.to_list().index(col)


# converting and appending other columns

start = indexer('A')
end = indexer('C')
cols = c[start:end].to_list()
cols.append('D')


df.loc[:, cols]

输出:

    A   B   D
0   1   a   1
1   1   a   2
2   1   a   3
3   2   a   1
4   2   a   -1
5   3   a   -1
6   3   a   -2
7   3   a   -3

其中包括切片 (A:C) 和指定的列 (D)。

使用@keramat 的数据,您可以使用 select_columns from pyjanitor 到 select 列(它在 selection 选项中提供了一些灵活性):

#pip install pyjanitor
import pandas as pd
import janitor

df = {'A': ['1', '1', '1', '2', '2', '3', '3', '3'],
 'B': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'],
 'C': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'],
 'D': [1, 2, 3, 1, -1, -1, -2, -3]}

df = pd.DataFrame(df)

df.select_columns(slice('A', 'C'), 'D')

   A  B  C  D
0  1  a  a  1
1  1  a  a  2
2  1  a  a  3
3  2  a  a  1
4  2  a  a -1
5  3  a  a -1
6  3  a  a -2
7  3  a  a -3

您不能为 slice 使用 : 快捷方式,您必须明确使用 slice 函数。

如果可以,请提供一个与您的想法最接近的示例,我会看看 select_columns 是否可以提供帮助,或者使用一些本机 pandas 选项。

loc

的解决方案
df.loc[:, ['D', *df.loc[:, 'A':'C'].columns]]

   D  A  B  C
0  1  1  a  a
1  2  1  a  a
2  3  1  a  a
3  1  2  a  a
4 -1  2  a  a
5 -1  3  a  a
6 -2  3  a  a
7 -3  3  a  a

经过一番思考,我想出了自己的解决方案:将单列和切片分别提取出来,concat。与此处发布的一些答案相比,我更喜欢它,但无论如何:

pd.concat([pd.DataFrame(games.loc[:,'Platform']),games.loc[:,'NA_Sales':'Other_Sales']],axis=1)

做了完全一样的工作

df.loc[:, ['Platform',*df.loc[:,'NA_Sales':'Other_Sales'].columns]]

感谢大家的支持,感激不尽