[Pandas] 10分钟Pandas之旅 02

操作

统计

此类操作默认排除缺失数据

# 求平均值
print(df.mean())
print("------")

# 指定求平均值的轴
print(df.mean(1))
print("------")

# 创建Series对象s,以dates为索引并平移2个位置
s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)
print(s)
print("------")

# 从df中逐列减去s(若有NaN则得NaN)
print(df.sub(s, axis='index'))

应用

对DataFrame中的数据应用函数。

# 逐行累加
print(df.apply(np.cumsum))
print("------")

# 每列的最大值减最小值
print(df.apply(lambda x: x.max() - x.min()))

字符

Series对象的str属性具有一系列字符处理方法,可以很轻松地操作数组的每个元素。

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

合并

连接

Pandas在join/merge两中情境下提供了支持多种方式,基于逻辑/集合运算和代数运算来连接Series,DataFrame和Panel对象。

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

# 拆分成块
pieces = [df[:3], df[3:7], df[7:]]

# 重新连接,可得初始数组
print(pd.concat(pieces))

增补

df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
print(df)
print("------")

# 将索引为3的行增补到整个DataFrame最后
s = df.iloc[3]
print(df.append(s, ignore_index=True))

组合

“组合”包含以下步骤:

  • 基于一定标准将数据分组
  • 对每个部分分别应用函数
  • 把结果汇合到数据结构中
# 新建DataFrame对象df
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)})

print(df)
print("------")


# 对'A'列进行合并并应用.sum()函数
print(df.groupby('A').sum())
print("------")


# 对'A', 'B'两列分别合并形成层级结构,再应用.sum()函数
print(df.groupby(['A','B']).sum())

重塑

tuples = list(zip(*[['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]))

# 多重索引
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
df2 = df[:4]

print(df2)

print("------")

# .stack()方法将DataFrame的列“压缩”了一级
stacked = df2.stack()

print(stacked)
对于已经层次化的,具有多重索引的DataFrame或Series, stack()的逆操作是 unstack()——默认将最后一级“去层次化”。
print(stacked.unstack())

print("------")

print(stacked.unstack(1))

print("------")

print(stacked.unstack(0))

数据透视表

df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3, 'B' : ['A', 'B', 'C'] * 4, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2, 'D' : np.random.randn(12), 'E' : np.random.randn(12)})

print(df)
print("------")

# 生成数据透视表
print(pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C']))

时间序列

Pandas提供了简单、强力且有效的工具,可以在频率转换中进行重采样(比如从秒级数据中提取5分钟一更新的数据)。这在金融工程中应用甚广,当然也不仅限于金融领域。

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

# 设定国际时区标准
ts_utc = ts.tz_localize('UTC')
print(ts_utc)

print("------")

# 切换时区
print(ts_utc.tz_convert('US/Eastern'))
周期和时间戳之间的转换让我们可以方便的使用一些算术运算。比如下面的例子,我们把一个以季度为单位的时间序列转换为按日期表示。

prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')

ts = pd.Series(np.random.randn(len(prng)), prng)
print(ts.head())

print("------")

ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9
print(ts.head())

分类

df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})
# 将原始记录转换为分类类型
df["grade"] = df["raw_grade"].astype("category")

print(df["grade"])
将类别重命名为更有意义的字样

df["grade"].cat.categories = ["very good", "good", "very bad"]

# 重排类别同时添加上缺失的类别名称
df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"])

print(df["grade"])
print("------")

# 排序在各分类中分别进行
print(df.sort_values(by="grade"))
print("------")

# 对类别列分组可以显示空类
print(df.groupby("grade").size())

绘图

# 生成一串随机序列
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))

# 求累加和
ts = ts.cumsum()

# 输出图象
ts.plot()
# 生成一个4列的DataFrame,每列1000行,并逐列累加
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=['A', 'B', 'C', 'D']) 
df = df.cumsum()

df.plot(); plt.legend(loc='best')

获取数据输入/输出

CSV

# 输出至.csv文件
df.to_csv('haha.csv')

# 从.csv文件中读取数据
pd.read_csv('haha.csv')

Excel

# 输出至.xlsx文件
df.to_excel('haha.xlsx', sheet_name='Sheet1')

# 从.xlsx文件中读取数据
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
('haha.csv')

















猜你喜欢

转载自blog.csdn.net/jdbc/article/details/72469320