如何对 pandas 数据框进行子集化

How to subset a pandas dataframe

我有一个 pandas 数据框,它有 50 列,我想选择 30 列。 假设我们有以下数据框:

df = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",............, "z"]

我想选择 "a" 和 "c",然后选择从 "h" 到 "z"

的所有列

请告知如何按名称或索引对该数据框进行子集化。

我希望生成的数据框如下所示:

df = ["a", "c", "h", "i", "j", "k", "l",............, "z"]

您可以使用numpy.r_ for concanecate positions of columns, then use iloc来选择:

print (df.iloc[:, np.r_[0,2,7: len(df.columns)]])

样本:

df = pd.DataFrame({'a':[1,2,3],
                   'b':[4,5,6],
                   'c':[7,8,9],
                   'd':[1,3,5],
                   'e':[5,3,6],
                   'f':[7,8,9],
                   'g':[1,3,5],
                   'h':[5,3,6],
                   'i':[7,8,9],
                   'j':[1,3,5],
                   'k':[5,3,6],
                   'l':[7,4,3],
                   'm':[7,4,3]})

print (df)
   a  b  c  d  e  f  g  h  i  j  k  l  m
0  1  4  7  1  5  7  1  5  7  1  5  7  7
1  2  5  8  3  3  8  3  3  8  3  3  4  4
2  3  6  9  5  6  9  5  6  9  5  6  3  3

print (np.r_[0,2,7: len(df.columns)])
[ 0  2  7  8  9 10 11 12]

print (df.iloc[:, np.r_[0,2,7: len(df.columns)]])
   a  c  h  i  j  k  l  m
0  1  7  5  7  1  5  7  7
1  2  8  3  8  3  3  4  4
2  3  9  6  9  5  6  3  3

另一个解决方案是使用 exclude listdifference:

exclude = ['b','d','e','f','g']
cols = df.columns.difference(exclude)
print (cols)
Index(['a', 'c', 'h', 'i', 'j', 'k', 'l', 'm'], dtype='object')

print (df[cols])
   a  c  h  i  j  k  l  m
0  1  7  5  7  1  5  7  7
1  2  8  3  8  3  3  4  4
2  3  9  6  9  5  6  3  3

drop列:

exclude = ['b','d','e','f','g']
print (df.drop(exclude, axis=1))
   a  c  h  i  j  k  l  m
0  1  7  5  7  1  5  7  7
1  2  8  3  8  3  3  4  4
2  3  9  6  9  5  6  3  3

只是使用名称的额外建议:
df=df.loc[:, ['a','c']].join(df.loc[:, 'h':'z'])