如何在 Pandas 中获取数据框的列切片

2025-02-14 09:50:00
admin
原创
79
摘要:问题描述:我从 CSV 文件中加载了一些机器学习数据。前两列是观察值,其余列是特征。目前,我做以下事情:data = pandas.read_csv('mydata.csv') 结果是这样的:data = pandas.DataFrame(np.random.rand(10,5), columns = lis...

问题描述:

我从 CSV 文件中加载了一些机器学习数据。前两列是观察值,其余列是特征。

目前,我做以下事情:

data = pandas.read_csv('mydata.csv')

结果是这样的:

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))

我想将此数据框切成两个数据框:一个包含列a和,b另一个包含列c和。d`e`

不可能写出类似的东西

observations = data[:'c']
features = data['c':]

我不确定最好的方法是什么。我需要吗pd.Panel

顺便说一句,我发现数据框索引非常不一致:data['a']允许,但data[0]不允许。另一方面,data['a':]不允许,但data[0:]允许。这有什么实际原因吗?如果列按 Int 索引,这确实令人困惑,因为data[0] != data[0:1]


解决方案 1:

2017 答案 - pandas 0.20:.ix 已弃用。使用 .loc

请参阅文档中的弃用内容

.loc使用基于标签的索引来选择行和列。标签是索引或列的值。切片.loc包括最后一个元素。

假设我们有一个包含以下列的DataFrame :

foo,,,,,,,。bar`quzantcatsatdat`

# selects all rows and all columns beginning at 'foo' up to and including 'sat'
df.loc[:, 'foo':'sat']
# foo bar quz ant cat sat

.loc接受与 Python 列表相同的切片符号,用于行和列。切片符号是start:stop:step

# slice from 'foo' to 'cat' by every 2nd column
df.loc[:, 'foo':'cat':2]
# foo quz cat

# slice from the beginning to 'bar'
df.loc[:, :'bar']
# foo bar

# slice from 'quz' to the end by 3
df.loc[:, 'quz'::3]
# quz sat

# attempt from 'sat' to 'bar'
df.loc[:, 'sat':'bar']
# no columns returned

# slice from 'sat' to 'bar'
df.loc[:, 'sat':'bar':-1]
sat cat ant quz bar

# slice notation is syntatic sugar for the slice function
# slice from 'quz' to the end by 2 with slice function
df.loc[:, slice('quz',None, 2)]
# quz cat dat

# select specific columns with a list
# select columns foo, bar and dat
df.loc[:, ['foo','bar','dat']]
# foo bar dat

您可以按行和列进行切片。例如,如果您有 5 行,标签为v, w, x, y,z

# slice from 'w' to 'y' and 'foo' to 'ant' by 3
df.loc['w':'y', 'foo':'ant':3]
#    foo ant
# w
# x
# y

解决方案 2:

注意: .ix自 Pandas v0.20 起已弃用。您应根据需要使用.loc.iloc

您想要访问的是 DataFrame.ix 索引。这有点令人困惑(我同意 Pandas 索引有时令人困惑!),但以下内容似乎可以满足您的要求:

>>> df = DataFrame(np.random.rand(4,5), columns = list('abcde'))
>>> df.ix[:,'b':]
      b         c         d         e
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

其中 .ix[row split, column split] 是要解释的内容。有关 Pandas 索引的更多信息,请参见:http: //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced

解决方案 3:

让我们使用 seaborn 包中的 titanic 数据集作为示例

# Load dataset (pip install seaborn)
>> import seaborn.apionly as sns
>> titanic = sns.load_dataset('titanic')

使用列名

>> titanic.loc[:,['sex','age','fare']]

使用列索引

>> titanic.iloc[:,[2,3,6]]

使用 ix (比 Pandas <.20 版本更旧)

>> titanic.ix[:,[‘sex’,’age’,’fare’]]

或者

>> titanic.ix[:,[2,3,6]]

使用重新索引方法

>> titanic.reindex(columns=['sex','age','fare'])

解决方案 4:

另外,给定一个 DataFrame

数据

就像您的示例一样,如果您只想提取 a 列和 d 列(即第 1 列和第 4 列),那么 pandas 数据框中的 iloc 方法就是您所需要的,并且可以非常有效地使用。您需要知道的只是要提取的列的索引。例如:

>>> data.iloc[:,[0,3]]

会给你

          a         d
0  0.883283  0.100975
1  0.614313  0.221731
2  0.438963  0.224361
3  0.466078  0.703347
4  0.955285  0.114033
5  0.268443  0.416996
6  0.613241  0.327548
7  0.370784  0.359159
8  0.692708  0.659410
9  0.806624  0.875476

解决方案 5:

DataFrame您可以通过引用列表中每列的名称来对列进行切片,如下所示:

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
data_ab = data[list('ab')]
data_cde = data[list('cde')]

解决方案 6:

如果你来这里是为了切分两列并将它们组合在一起(就像我一样),你可以这样做

op = df[list(df.columns[0:899]) + list(df.columns[3593:])]
print op

这将创建一个新的数据框,其中包含前 900 列和(所有)列 > 3593(假设您的数据集中有大约 4000 列)。

解决方案 7:

以下是如何使用不同的方法进行选择性列切片,包括基于选择性标签的切片、基于索引的切片和基于选择性范围的切片。

In [37]: import pandas as pd    
In [38]: import numpy as np
In [43]: df = pd.DataFrame(np.random.rand(4,7), columns = list('abcdefg'))

In [44]: df
Out[44]: 
          a         b         c         d         e         f         g
0  0.409038  0.745497  0.890767  0.945890  0.014655  0.458070  0.786633
1  0.570642  0.181552  0.794599  0.036340  0.907011  0.655237  0.735268
2  0.568440  0.501638  0.186635  0.441445  0.703312  0.187447  0.604305
3  0.679125  0.642817  0.697628  0.391686  0.698381  0.936899  0.101806

In [45]: df.loc[:, ["a", "b", "c"]] ## label based selective column slicing 
Out[45]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

In [46]: df.loc[:, "a":"c"] ## label based column ranges slicing 
Out[46]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

In [47]: df.iloc[:, 0:3] ## index based column ranges slicing 
Out[47]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

### with 2 different column ranges, index based slicing: 
In [49]: df[df.columns[0:1].tolist() + df.columns[1:3].tolist()]
Out[49]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

解决方案 8:

假设您想要所有行,从 DataFrame 中获取列子集的另一种方法是执行以下操作:

data[['a','b']]如果data[['c','d','e']]

您想使用数字列索引,您可以执行

data[data.columns[:2]]以下操作:data[data.columns[2:]]

解决方案 9:

其等价物

 >>> print(df2.loc[140:160,['Relevance','Title']])
 >>> print(df2.ix[140:160,[3,7]])

解决方案 10:

如果数据框看起来像这样:

group         name      count
fruit         apple     90
fruit         banana    150
fruit         orange    130
vegetable     broccoli  80
vegetable     kale      70
vegetable     lettuce   125

输出可能像

   group    name  count
0  fruit   apple     90
1  fruit  banana    150
2  fruit  orange    130

如果你使用逻辑运算符 np.logical_not

df[np.logical_not(df['group'] == 'vegetable')]

更多信息

https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html

其他逻辑运算符

  1. logical_and(x1, x2, /[, out, where, ...]) 逐个元素计算 x1 和 x2 的真值。

  2. logical_or(x1, x2, /[, out, where, casting, ...]) 逐个元素计算 x1 或 x2 的真值。

  3. logical_not(x, /[, out, where, casting, ...]) 逐个元素计算 NOT x 的真值。

  4. logical_xor(x1, x2, /[, out, where, ..]) 逐个元素计算 x1 XOR x2 的真值。

解决方案 11:

您可以使用该方法truncate

df = pd.DataFrame(np.random.rand(10, 5), columns = list('abcde'))

df_ab = df.truncate(before='a', after='b', axis=1)
df_cde = df.truncate(before='c', axis=1)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2805  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1713  
  PLM(产品生命周期管理)项目管理系统在企业产品研发与管理过程中扮演着至关重要的角色。然而,在项目推进过程中,资源冲突是不可避免的问题,它会影响项目进度、质量,甚至导致项目失败。有效解决资源冲突对于PLM项目管理系统的成功运行至关重要。接下来,我们将探讨应对资源冲突的5大策略。合作策略合作策略是一种双赢的解决方式。在P...
国内plm系统排名   0  
  产品生命周期管理(PLM)软件近年来在企业数字化转型进程中扮演着愈发重要的角色。对于中小企业而言,PLM软件的应用不仅是提升管理效率的工具,更是实现业务创新与可持续发展的关键助力。它涵盖了从产品的概念设计、研发、生产、销售到售后服务的全流程管理,通过整合企业内外部资源,优化业务流程,为企业创造显著的价值。然而,中小企业...
plm系统   0  
  项目复盘是项目管理中的重要环节,它能够帮助团队总结经验教训,提升后续项目的执行能力。PLM(产品生命周期管理)系统作为整合产品全生命周期信息的平台,为项目复盘提供了强大的支持。通过PLM系统实现项目复盘,能够更高效、全面地审视项目过程,挖掘潜在问题,为未来项目的成功奠定基础。明确复盘目标与范围明确复盘目标是项目复盘的首...
plm是什么意思   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用