按名称列表对 Pandas 中的多个列范围进行切片
Slicing multiple ranges of columns in Pandas, by list of names
我正在尝试通过两种不同的方法select 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 中的列的最佳(或正确)方法是什么?
我认为您需要 numpy.r_
for concanecate positions of columns, then use 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
(必须在 python 3
中转换为 list
):
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
我不确定你到底在问什么,但一般来说 DataFrame.loc
allows you to select by label, DataFrame.iloc
按索引。
例如选择第 0、1 和 4 列:
dataframe.iloc[:, [0, 1, 4]]
并选择标记为 'A'、'B' 和 'C' 的列:
dataframe.loc[:, ['A', 'B', 'C']]
我正在尝试通过两种不同的方法select 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 中的列的最佳(或正确)方法是什么?
我认为您需要 numpy.r_
for concanecate positions of columns, then use 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
(必须在 python 3
中转换为 list
):
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
我不确定你到底在问什么,但一般来说 DataFrame.loc
allows you to select by label, DataFrame.iloc
按索引。
例如选择第 0、1 和 4 列:
dataframe.iloc[:, [0, 1, 4]]
并选择标记为 'A'、'B' 和 'C' 的列:
dataframe.loc[:, ['A', 'B', 'C']]