Python 之 pandas 用法
导入
- import pandas as pd
- Series
用 pandas 的 Series 函数从数组或列表中创建一个可自定义下标 (index) 并自动维护标号索引的一维数组
- a = pd.Series([0.25, 0.5, 0.75, 1.0])
- print(a)
- b = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd']) # 自定义下标
- print(b)
- c = pd.Series({'a': 0.25, 'b': 0.5, 'c': 0.75, 'd': 1.0}) # 从 dict 创建
- print(c)
- '''
- 输出
- 0 0.25
- 1 0.50
- 2 0.75
- 3 1.00
- dtype: float64
- a 0.25
- b 0.50
- c 0.75
- d 1.00
- dtype: float64
- a 0.25
- b 0.50
- c 0.75
- d 1.00
- dtype: float64
- '''
其中 index 和 values 都是可迭代的对象, 并且可以像 dict 那样进行下标访问
- print(a.values)
- print(b.index)
- print(c['b'])
- '''
- 输出
- [0.25 0.5 0.75 1. ]
- Index(['a', 'b', 'c', 'd'], dtype='object')
- 0.5
- '''
这里有一些小 trick
- print(b[b> 0.7] * 2)
- print(c.sort_values) # 按 value 排序
- print(b[1:3]) # 切片的下标对应的是自动维护的标号索引
- '''
- 输出
- c 1.5
- d 2.0
- dtype: float64
- <bound method Series.sort_values of a 0.25
- b 0.50
- c 0.75
- d 1.00
- dtype: float64>
- b 0.50
- c 0.75
- dtype: float64
- '''
用 loc 和 iloc 分别表示访问自定义索引和自动维护的标号索引
- data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])
- print(data.loc[1])
- print(data.iloc[1])
- '''
- 输出
- a
- b
- '''
Series 可以更新索引, 如果一个旧索引在新索引中没有出现过, 则会被除去; 若一个新索引在旧索引中没有出现, 就会显示 NaN(not a number), 表示缺失.
- sdata = {'a': 1, 'b': 3, 'c': 5, 'd': 7}
- obj1 = pd.Series(sdata)
- print(obj1)
- states = ['b', 'c', 'd', 'e']
- obj2 = pd.Series(sdata, index=states)
- print(obj2)
- '''
- 输出
- a 1
- b 3
- c 5
- d 7
- dtype: int64
- b 3.0
- c 5.0
- d 7.0
- e NaN
- dtype: float64
- '''
Series 还会根据运算的索引标签自动对齐数据
- print(obj1 + obj2)
- '''
- 输出
- a NaN
- b 6.0
- c 10.0
- d 14.0
- e NaN
- dtype: float64
- '''
- DataFrame
用多个 Series 的组合生成 DataFrame
- tag1_dict = {'a': 1, 'b': 2, 'c': 3}
- tag1 = pd.Series(tag1_dict)
- tag2_dict = {'b': 11, 'c': 12, 'd': 13}
- tag2 = pd.Series(tag2_dict)
- df = pd.DataFrame({'tag1': tag1, 'tag2': tag2})
- print(df)
- '''
- 输出
- tag1 tag2
- a 1.0 NaN
- b 2.0 11.0
- c 3.0 12.0
- d NaN 13.0
- '''
用词典的列表生成 DataFrame
- data = [{'a': i, 'b': i * 2} for i in range(3)]
- print(pd.DataFrame(data))
- '''
- 输出
- a b
- 0 0 0
- 1 1 2
- 2 2 4
- '''
用一个 numpy 的二维数组生成 DataFrame, 并自定义行和列索引
- print(pd.DataFrame(np.random.rand(3, 2), columns=['a', 'b'], index=['c', 'd', 'e']))
- '''
- 输出
- a b
- c 0.341337 0.379886
- d 0.968444 0.595278
- e 0.207694 0.440617
- '''
获取一列
- print(df.tag1)
- print(df['tag1'])
- '''
- 输出
- a 1.0
- b 2.0
- c 3.0
- d NaN
- Name: tag1, dtype: float64
- a 1.0
- b 2.0
- c 3.0
- d NaN
- Name: tag1, dtype: float64
- '''
直接新添加一列
- df['tag3'] = df['tag1'] + df['tag2']
- print(df)
- '''
- 输出
- tag1 tag2 tag3
- a 1.0 NaN NaN
- b 2.0 11.0 13.0
- c 3.0 12.0 15.0
- d NaN 13.0 NaN
- '''
行列互换
- s = df.T
- print(s)
- '''
- 输出
- a b c d
- tag1 1.0 2.0 3.0 NaN
- tag2 NaN 11.0 12.0 13.0
- tag3 NaN 13.0 15.0 NaN
- '''
筛选
- print(df.loc[df.tag2> 11, ['tag1', 'tag2']])
- '''
- 输出
- tag1 tag2
- c 3.0 12.0
- d NaN 13.0
- '''
赋值
- df.iloc[1, 1] = 100
- print(df)
- '''
- 输出
- tag1 tag2 tag3
- a 1.0 NaN NaN
- b 2.0 100.0 13.0
- c 3.0 12.0 15.0
- d NaN 13.0 NaN
- '''
可以在 numpy 的函数中直接传入一个 DataFrame, 相当于把函数作用于其中的所有值
- df = pd.DataFrame(np.random.randint(0, 10, (2, 3)), columns=['a', 'b', 'c'])
- print(np.sin(df * np.pi / 4))
- '''
- 输出
- a b c
- 0 -1.0 0.707107 -1.000000
- 1 -1.0 0.707107 -0.707107
- '''
DataFrame 之间的运算自动进行索引对其和补足
- df1 = pd.DataFrame(np.random.randint(0, 3, (2, 2)), columns=['a', 'b'])
- df2 = pd.DataFrame(np.random.randint(0, 3, (2, 2)), columns=['b', 'c'])
- print(df1 + df2)
- print(df1.add(df2, fill_value=100))
- '''
- 输出
- a b c
- 0 NaN 3 NaN
- 1 NaN 2 NaN
- a b c
- 0 100.0 3 102.0
- 1 101.0 2 101.0
- '''
DataFrame 与 Series 进行计算, 相当于按行或按列广播
- df = pd.DataFrame(np.random.randint(0, 10, (2, 2)), columns=['a', 'b'])
- print(df)
- print(df - df.iloc[1])
- '''
- 输出
- a b
- 0 3 8
- 1 4 5
- a b
- 0 -1 3
- 1 0 0
- '''
Python 之 pandas 用法(1)
来源: http://www.bubuko.com/infodetail-3257623.html