数据挖掘 pandas基础入门之选择

虽然标准的 Python/Numpy 的选择和设置表达式都能够直接派上用场,但是作为工程使用的代码,我们推荐使用经过优化的 pandas 数据访问方式:.at,.iat,.loc,.iloc和.ix。

获取

import pandas
import numpy

# 通过传递一个 numpyarray,时间索引以及列标签来创建一个DataFrame:
dates = pandas.date_range("20180509", periods=6)
df = pandas.DataFrame(numpy.random.randn(6, 4), index=dates, columns=list('ABCD'))
print("时间索引以及列标签来创建一个DataFrame:", df, sep="\n")

#  选择一个单独的列,这将会返回一个Series,等同于df.A
print("读取A列:", df['A'], sep="\n")  # Freq表示列,D表示日期

# 通过[]进行选择、切片
print("读取0到2行: ", df[0:3], sep="\n")
print("通过行名,读取指定行:", df['2018-05-09':'2018-05-11 '], sep="\n")
"E:\Python 3.6.2\python.exe" F:/PycharmProjects/test.py
时间索引以及列标签来创建一个DataFrame:
                   A         B         C         D
2018-05-09  0.019684  0.015831  0.014346 -0.612275
2018-05-10 -0.755389  0.290763 -1.175651  0.014877
2018-05-11 -0.004793 -1.615366  0.271680 -0.933383
2018-05-12 -1.229533 -0.222638  0.057783 -0.172315
2018-05-13  0.082170 -0.483592 -0.058921  0.081162
2018-05-14 -0.219111  1.482332  0.316326  0.243370
读取A列:
2018-05-09    0.019684
2018-05-10   -0.755389
2018-05-11   -0.004793
2018-05-12   -1.229533
2018-05-13    0.082170
2018-05-14   -0.219111
Freq: D, Name: A, dtype: float64
读取0到2行: 
                   A         B         C         D
2018-05-09  0.019684  0.015831  0.014346 -0.612275
2018-05-10 -0.755389  0.290763 -1.175651  0.014877
2018-05-11 -0.004793 -1.615366  0.271680 -0.933383
通过行名,读取指定行:
                   A         B         C         D
2018-05-09  0.019684  0.015831  0.014346 -0.612275
2018-05-10 -0.755389  0.290763 -1.175651  0.014877
2018-05-11 -0.004793 -1.615366  0.271680 -0.933383

Process finished with exit code 0

通过标签选择

import pandas
import numpy

# 通过传递一个 numpyarray,时间索引以及列标签来创建一个DataFrame:
dates = pandas.date_range("20180509", periods=6)
df = pandas.DataFrame(numpy.random.randn(6, 4), index=dates, columns=list('ABCD'))
print("时间索引以及列标签来创建一个DataFrame:", df, sep="\n")

# 使用标签来获取一个交叉区域
print("定位到dates[0],获取此行数据,包括列编号: ", df.loc[dates[0]], sep="\n")

# 通过标签来在多个轴上进行选择
print("获取此行数据第A,B列: ", df.loc[:, ['A', 'B']], sep="\n")

# 标签切片
print("定位到dates[2],获取此行数据第A,B列: ", df.loc[:dates[2], ['A', 'B']], sep="\n")

# 对于返回对象进行维度缩减(获取指定对象)
print("定位到dates[0],获取此行数据A, B列:",  df.loc[dates[0], ['A', 'B']], sep="\n")

# 获取一个标量
print("定位到dates[0],获取此行数据A列数据:", df.loc[dates[0], 'A'], sep="\n")

# 快速访问一个标量(与上述等价)
print("定位到dates[0],获取此行数据A列数据:", df.at[dates[0], 'A'])
"E:\Python 3.6.2\python.exe" F:/PycharmProjects/test.py
时间索引以及列标签来创建一个DataFrame:
                   A         B         C         D
2018-05-09 -0.271226  0.240662 -0.319637 -0.499980
2018-05-10 -1.943469 -0.503852 -0.139032 -0.504864
2018-05-11 -0.565398 -0.979566 -0.752174  1.565527
2018-05-12  0.562519 -0.608038 -0.756975  1.181634
2018-05-13 -0.196046 -0.055726  0.302884  0.811187
2018-05-14 -0.054767 -0.291400 -0.674922  0.325859
定位到dates[0],获取此行数据,包括列编号: 
A   -0.271226
B    0.240662
C   -0.319637
D   -0.499980
Name: 2018-05-09 00:00:00, dtype: float64
获取此行数据第A,B列: 
                   A         B
2018-05-09 -0.271226  0.240662
2018-05-10 -1.943469 -0.503852
2018-05-11 -0.565398 -0.979566
2018-05-12  0.562519 -0.608038
2018-05-13 -0.196046 -0.055726
2018-05-14 -0.054767 -0.291400
定位到dates[2],获取此行数据第A,B列: 
                   A         B
2018-05-09 -0.271226  0.240662
2018-05-10 -1.943469 -0.503852
2018-05-11 -0.565398 -0.979566
定位到dates[0],获取此行数据A, B列:
A   -0.271226
B    0.240662
Name: 2018-05-09 00:00:00, dtype: float64
定位到dates[0],获取此行数据A列数据:
-0.27122562914
定位到dates[0],获取此行数据A列数据: -0.27122562914

Process finished with exit code 0

通过位置选择

import pandas
import numpy

# 通过传递一个 numpyarray,时间索引以及列标签来创建一个DataFrame:
dates = pandas.date_range("20180509", periods=6)
df = pandas.DataFrame(numpy.random.randn(6, 4), index=dates, columns=list('ABCD'))
print("时间索引以及列标签来创建一个DataFrame:", df, sep="\n")

# 通过传递数值进行位置选择(选择的是行)
print("选择第四行的数据:", df.iloc[3], sep="\n")

# 通过数值进行切片
print("选择第4到6行,A、B列的数据:", df.iloc[3:5, 0:2], sep="\n")

# 通过制定一个位置的列表
print("选择第2、3、5行,A、C列的数据:", df.iloc[[1, 2, 4], [0, 2]], sep="\n")

# 对行进行切片
print("选择第2到3行所以的数据:", df.iloc[1:3, :], sep="\n")

# 对列进行切片
print("选择第2到3列所以的数据:", df.iloc[:, 1:3], sep="\n")

# 获取特定的值
print("选择第二行第二列的数值:", df.iloc[1, 1], sep="\n")

# 快速访问标量(同上)
print("选择第二行第二列的数值:", df.iat[1, 1], sep="\n")
"E:\Python 3.6.2\python.exe" F:/PycharmProjects/test.py
时间索引以及列标签来创建一个DataFrame:
                   A         B         C         D
2018-05-09  0.291994  1.534579  0.868172  0.316073
2018-05-10  1.405779 -0.715680 -0.836181  0.427327
2018-05-11 -1.105414 -0.362251  0.481224 -0.597738
2018-05-12  1.327585  1.453257  0.390719 -0.224368
2018-05-13  0.190963 -2.235456 -0.241765  1.086672
2018-05-14 -1.208381  0.167448  0.517565  1.256895
选择第四行的数据:
A    1.327585
B    1.453257
C    0.390719
D   -0.224368
Name: 2018-05-12 00:00:00, dtype: float64
选择第4到6行,A、B列的数据:
                   A         B
2018-05-12  1.327585  1.453257
2018-05-13  0.190963 -2.235456
选择第2、3、5行,A、C列的数据:
                   A         C
2018-05-10  1.405779 -0.836181
2018-05-11 -1.105414  0.481224
2018-05-13  0.190963 -0.241765
选择第2到3行所以的数据:
                   A         B         C         D
2018-05-10  1.405779 -0.715680 -0.836181  0.427327
2018-05-11 -1.105414 -0.362251  0.481224 -0.597738
选择第2到3列所以的数据:
                   B         C
2018-05-09  1.534579  0.868172
2018-05-10 -0.715680 -0.836181
2018-05-11 -0.362251  0.481224
2018-05-12  1.453257  0.390719
2018-05-13 -2.235456 -0.241765
2018-05-14  0.167448  0.517565
选择第二行第二列的数值:
-0.715680058102
选择第二行第二列的数值:
-0.715680058102

Process finished with exit code 0

布尔索引

Selecting values from a DataFrame where a boolean condition is met.

并不是网上的翻译--使用where操作来选择数据,跟where无关。

nan表示缺省值,下一篇介绍。

import pandas
import numpy

# 通过传递一个 numpyarray,时间索引以及列标签来创建一个DataFrame:
dates = pandas.date_range("20180509", periods=6)
df = pandas.DataFrame(numpy.random.randn(6, 4), index=dates, columns=list('ABCD'))
print("时间索引以及列标签来创建一个DataFrame:", df, sep="\n")

# 使用单独列的值来选择数据
print("选择A列中大于0的所有数据:", df[df.A > 0], sep="\n")

# Selecting values from a DataFrame where a boolean condition is met.
# 而不是所说的“使用where操作来选择数据”,跟where无关
print("结果中只显示大于0的数据:", df[df > 0], sep="\n")

# 使用isin() 方法过滤
df_copy = df.copy()
df_copy['E'] = ["one", "one", "two", "three", "four", "three"]
print(df_copy[df_copy['E'].isin(["two", "four"])])
"E:\Python 3.6.2\python.exe" F:/PycharmProjects/test.py
时间索引以及列标签来创建一个DataFrame:
                   A         B         C         D
2018-05-09  0.084371 -1.294719 -0.910606  0.906577
2018-05-10  0.359351  0.695113  1.644234 -0.237117
2018-05-11  1.483648 -0.321647  1.562186  1.115556
2018-05-12 -0.208955  0.957598 -0.683687  1.604825
2018-05-13  0.412907  0.405832  0.187539  0.820254
2018-05-14 -0.655372 -0.319544  1.233828  1.005161
选择A列中大于0的所有数据:
                   A         B         C         D
2018-05-09  0.084371 -1.294719 -0.910606  0.906577
2018-05-10  0.359351  0.695113  1.644234 -0.237117
2018-05-11  1.483648 -0.321647  1.562186  1.115556
2018-05-13  0.412907  0.405832  0.187539  0.820254
结果中只显示大于0的数据:
                   A         B         C         D
2018-05-09  0.084371       NaN       NaN  0.906577
2018-05-10  0.359351  0.695113  1.644234       NaN
2018-05-11  1.483648       NaN  1.562186  1.115556
2018-05-12       NaN  0.957598       NaN  1.604825
2018-05-13  0.412907  0.405832  0.187539  0.820254
2018-05-14       NaN       NaN  1.233828  1.005161
                   A         B         C         D     E
2018-05-11  1.483648 -0.321647  1.562186  1.115556   two
2018-05-13  0.412907  0.405832  0.187539  0.820254  four

Process finished with exit code 0

设置

import pandas
import numpy

# 通过传递一个 numpyarray,时间索引以及列标签来创建一个DataFrame:
dates = pandas.date_range("20180509", periods=6)
df = pandas.DataFrame(numpy.random.randn(6, 4), index=dates, columns=list('ABCD'))
print("时间索引以及列标签来创建一个DataFrame:", df, sep="\n")

# 设置一个新列, 列号一致
sl = pandas.Series([1, 2, 3, 4, 5, 6], index=pandas.date_range("20180509", periods=6))
df['F'] = sl
print("新增后的数据集:", df, sep="\n")

# 通过标签设置新的值
df.at[dates[0], 'A'] = 0
print("更改后的数据集:", df, sep="\n")

# 通过一个numpy数组设置一组新值:
df.loc[:, "D"] = numpy.array([5]*len(df))
print("通过numpy数组把df的‘D’列的值改成5:", df, sep="\n")

# A where operation with setting.
df_copy = df.copy()
df_copy[df_copy > 0] = -df_copy
print("所有大于零的数改成其相反数:", df_copy, sep="\n")
"E:\Python 3.6.2\python.exe" F:/PycharmProjects/test.py
时间索引以及列标签来创建一个DataFrame:
                   A         B         C         D
2018-05-09  1.387991  0.691817 -0.027246 -0.086238
2018-05-10  1.333645  0.132900  0.842414 -1.798552
2018-05-11 -1.665658 -0.440295  0.776599  0.619034
2018-05-12  1.523061  0.525106 -0.408160 -1.053564
2018-05-13  2.079675 -2.734948 -0.187317 -2.325619
2018-05-14 -0.555644  0.544446 -2.341367 -1.222438
新增后的数据集:
                   A         B         C         D  F
2018-05-09  1.387991  0.691817 -0.027246 -0.086238  1
2018-05-10  1.333645  0.132900  0.842414 -1.798552  2
2018-05-11 -1.665658 -0.440295  0.776599  0.619034  3
2018-05-12  1.523061  0.525106 -0.408160 -1.053564  4
2018-05-13  2.079675 -2.734948 -0.187317 -2.325619  5
2018-05-14 -0.555644  0.544446 -2.341367 -1.222438  6
更改后的数据集:
                   A         B         C         D  F
2018-05-09  0.000000  0.691817 -0.027246 -0.086238  1
2018-05-10  1.333645  0.132900  0.842414 -1.798552  2
2018-05-11 -1.665658 -0.440295  0.776599  0.619034  3
2018-05-12  1.523061  0.525106 -0.408160 -1.053564  4
2018-05-13  2.079675 -2.734948 -0.187317 -2.325619  5
2018-05-14 -0.555644  0.544446 -2.341367 -1.222438  6
通过numpy数组把df的‘D’列的值改成5:
                   A         B         C  D  F
2018-05-09  0.000000  0.691817 -0.027246  5  1
2018-05-10  1.333645  0.132900  0.842414  5  2
2018-05-11 -1.665658 -0.440295  0.776599  5  3
2018-05-12  1.523061  0.525106 -0.408160  5  4
2018-05-13  2.079675 -2.734948 -0.187317  5  5
2018-05-14 -0.555644  0.544446 -2.341367  5  6
所有大于零的数改成其相反数:
                   A         B         C  D  F
2018-05-09  0.000000 -0.691817 -0.027246 -5 -1
2018-05-10 -1.333645 -0.132900 -0.842414 -5 -2
2018-05-11 -1.665658 -0.440295 -0.776599 -5 -3
2018-05-12 -1.523061 -0.525106 -0.408160 -5 -4
2018-05-13 -2.079675 -2.734948 -0.187317 -5 -5
2018-05-14 -0.555644 -0.544446 -2.341367 -5 -6

Process finished with exit code 0

 

转载于:https://my.oschina.net/gain/blog/1821038

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值