pandas基础

pandas 中有三种基本结构:

  • Series
  • DataFrame
  • Panel

一维 Series 可以用一维列表初始化:

s = pd.Series([1,3,5,np.nan,6,8])
print(s)

输出:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64

DataFrame 则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:

dates = pd.date_range('20130101', periods=6)
print(dates)

输出:
DatetimeIndex([‘2013-01-01’, ‘2013-01-02’, ‘2013-01-03’,
‘2013-01-04’,
‘2013-01-05’, ‘2013-01-06’],
dtype=‘datetime64[ns]’, freq=‘D’)

然后创建一个 DataFrame 结构:
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))

df

默认情况下,如果不指定 index 参数和 columns,那么他们的值将用从 0 开始的数字替代。

除了向 DataFrame 中传入二维数组,我们也可以使用字典传入数据:

df2 = pd.DataFrame({'A' : 1.,
                    'B' : pd.Timestamp('20130102'),
                    'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
                    'D' : np.array([3] * 4,dtype='int32'),
                    'E' : pd.Categorical(["test","train","test","train"]),
                    'F' : 'foo' })

df2

字典的每个 key 代表一列,其 value 可以是各种能够转化为 Series 的对象。

与 Series 要求所有的类型都一致不同,DataFrame 值要求每一列数据的格式相同。
head 和 tail 方法可以分别查看最前面几行和最后面几行的数据(默认为 5):

df.head()
df.tail(3)

下标使用 index 属性查看,列标使用 columns 属性查看,数据值使用 values 查看。
查看简单的统计数据:df.describe()
转置:df.T

sort_index(axis=0, ascending=True) 方法按照下标大小进行排序,axis=0 表示按第 0 维进行排序。
sort_values(by, axis=0, ascending=True) 方法按照 by 的值的大小进行排序,例如按照 B 列的大小:

df.sort_values(by="B")

虽然 DataFrame 支持 Python/Numpy 的索引语法,但是推荐使用 .at, .iat, .loc, .iloc 和 .ix 方法进行索引。

loc 可以方便的使用 label 进行索引,不过得到标量值可以用 at,速度更快;iloc 使用位置进行索引,当然,使用 iat 索引标量值更快。

所有 A 列大于 0 的行:

df[df.A > 0]

使用 isin 方法做 filter 过滤:

df2 = df.copy()
df2['E'] = ['one', 'one','two','three','four','three']

df2

df2[df2['E'].isin(['two','four'])]

丢弃所有缺失数据的行得到的新数据:

df1.dropna(how='any')

填充缺失数据:

df1.fillna(value=5)

检查缺失数据的位置:

pd.isnull(df1)

每一列的均值:df.mean()
每一行的均值:df.mean(1)

与 R 中的 apply 操作类似,接收一个函数,默认是对将函数作用到每一列上:df.apply(np.cumsum)
求每列最大最小值之差:df.apply(lambda x: x.max() - x.min())

直方图

s = pd.Series(np.random.randint(0, 7, size=10))

s
s.value_counts()
h = s.hist()

当 Series 或者 DataFrame 的某一列是字符串时,我们可以用 .str 对这个字符串数组进行字符串的基本操作:

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])

s.str.lower()

连接

df = pd.DataFrame(np.random.randn(10, 4))
df

pieces = [df[:2], df[4:5], df[7:]]

pd.concat(pieces)

merge 可以实现数据库中的 join 操作:

left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})

print(left)
print(right)
pd.merge(left, right, on='key')

将第三行的值添加到最后:

s = df.iloc[3]

df.append(s, ignore_index=True)

分类:

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                          'foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three',
                          'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})

df

按照 A 的值进行分类:df.groupby('A').sum()
按照 A, B 的值进行分类:df.groupby(['A', 'B']).sum()

金融分析中常用到时间序列数据:

rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D')
ts = pd.Series(np.random.randn(len(rng)), rng)

ts

标准时间表示:

ts_utc = ts.tz_localize('UTC')

ts_utc

改变时区表示:

ts_utc.tz_convert('US/Eastern')

分类

df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})

df

#可以将 `grade` 变成类别:
df["grade"] = df["raw_grade"].astype("category")

df["grade"]

#将类别的表示转化为有意义的字符:
df["grade"].cat.categories = ["very good", "good", "very bad"]

df["grade"]

#添加缺失的类别:
df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"])
df["grade"]

#使用 grade 分组:
df.groupby("grade").size()

使用 ggplot 风格:plt.style.use('ggplot')
Series 绘图:

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))

p = ts.cumsum().plot()

DataFrame 按照 columns 绘图:

df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,
                  columns=['A', 'B', 'C', 'D'])

df.cumsum().plot()
p = plt.legend(loc="best")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值