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]]
感谢大家的支持,感激不尽
使用 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]]
感谢大家的支持,感激不尽