pandas的基本函数

pandas的基本函数

实验目的
熟练掌握pandas基本函数使用方法

实验原理

列转行方法
stack函数:pandas.DataFrame.stack(self, level=-1, dropna=True),对于普通的DataFrame而言,直接列索引转换到最内层行索引,生一个Series对象。
对于层次化索引的DataFrame而言,可以将指定的索引层转换到行上,默认是将最内层的列索引转换到最内层行。
unstack函数:pandas.DataFrame.unstack(self, level=-1, fill_value=None),对于普通的DataFrame而言,直接将列索引转换到行索引的最外层索引,生成一个Series对象,对于层次化索引的DataFrame而言,和stack函数类似,似乎把两层索引当作一个整体,当level为列表时报错。
melt函数:pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name=‘value’, col_level=None),id_vars可以理解为结果需要保留的原始列,value_vars可以理解为需要列转行的列名;
var_name把列转行的列变量重新命名,默认为variable;value_name列转行对应变量的值的名称。

行转列方法
unstack函数:pandas.DataFrame.unstack(self, level=-1, fill_value=None)

实验环境

Python 3.6.1
Jupyter

实验内容
练习pandas的主要的基本函数的使用。

代码部分

import pandas as pd
import numpy as np

1.创建一个DataFrame,名为df

df = pd.DataFrame({'A':np.random.randint(1, 100, 4),'B':pd.date_range(start='20130101', periods=4, freq='D'),'C':pd.Series([1, 2, 3, 4],index=['zhang', 'li', 'zhou', 'wang'],dtype='float32'),'D':np.array([3] * 4,dtype='int32'), 'E':pd.Categorical(["test","train","test","train"]),'F':'foo'})  
df
ABCDEF
zhang122013-01-011.03testfoo
li402013-01-022.03trainfoo
zhou262013-01-033.03testfoo
wang272013-01-044.03trainfoo

2.二维数据查看

df.head() # 默认前五行
ABCDEF
zhang122013-01-011.03testfoo
li402013-01-022.03trainfoo
zhou262013-01-033.03testfoo
wang272013-01-044.03trainfoo
df.head(3)   # 查看前三行
ABCDEF
zhang122013-01-011.03testfoo
li402013-01-022.03trainfoo
zhou262013-01-033.03testfoo
df.tail(2) # 查看后两行
ABCDEF
zhou262013-01-033.03testfoo
wang272013-01-044.03trainfoo

3.查看二维数据的索引、列名和数据

df.index
Index(['zhang', 'li', 'zhou', 'wang'], dtype='object')
df.columns
Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
df.values
array([[12, Timestamp('2013-01-01 00:00:00'), 1.0, 3, 'test', 'foo'],
       [40, Timestamp('2013-01-02 00:00:00'), 2.0, 3, 'train', 'foo'],
       [26, Timestamp('2013-01-03 00:00:00'), 3.0, 3, 'test', 'foo'],
       [27, Timestamp('2013-01-04 00:00:00'), 4.0, 3, 'train', 'foo']],
      dtype=object)

4.查看数据的统计信息

df.describe()
ACD
count4.0000004.0000004.0
mean26.2500002.5000003.0
std11.4418821.2909940.0
min12.0000001.0000003.0
25%22.5000001.7500003.0
50%26.5000002.5000003.0
75%30.2500003.2500003.0
max40.0000004.0000003.0

5.二维数据转置

df.T
zhanglizhouwang
A12402627
B2013-01-01 00:00:002013-01-02 00:00:002013-01-03 00:00:002013-01-04 00:00:00
C1234
D3333
Etesttraintesttrain
Ffoofoofoofoo

6.排序

df.sort_index(axis=0, ascending=False)     # 对索引进行降序排序  
ABCDEF
zhou262013-01-033.03testfoo
zhang122013-01-011.03testfoo
wang272013-01-044.03trainfoo
li402013-01-022.03trainfoo
df.sort_index(axis=0, ascending=True)      # 对索引进行升序排序  
ABCDEF
li402013-01-022.03trainfoo
wang272013-01-044.03trainfoo
zhang122013-01-011.03testfoo
zhou262013-01-033.03testfoo
df.sort_index(axis=1, ascending=False)     # 对列名进行降序排序  
FEDCBA
zhangfootest31.02013-01-0112
lifootrain32.02013-01-0240
zhoufootest33.02013-01-0326
wangfootrain34.02013-01-0427
df.sort_values(by='A')                     # 对A列的值进行升序排序 
ABCDEF
zhang122013-01-011.03testfoo
zhou262013-01-033.03testfoo
wang272013-01-044.03trainfoo
li402013-01-022.03trainfoo

7.重复值处理

data = pd.DataFrame({'k1':['one'] * 3 + ['two'] * 4, 'k2':[1, 1, 2, 3, 3, 4, 4]})  
data
k1k2
0one1
1one1
2one2
3two3
4two3
5two4
6two4

1)检测重复行

data.duplicatedlicated()
0    False
1     True
2    False
3    False
4     True
5    False
6     True
dtype: bool

2) 返回新数组,删除重复行

data.drop_duplicates() 
k1k2
0one1
2one2
3two3
5two4

3)删除k1列的重复数据,保留首行重复数据。

data.drop_duplicates(['k1'],keep='last')  
k1k2
2one2
6two4

8.映射

1)使用函数进行映射,将data中k1列的值转换为大写

data['k1']=data['k1'].map(str.upper)  
data  
k1k2
0ONE1
1ONE1
2ONE2
3TWO3
4TWO3
5TWO4
6TWO4

2)使用字典表示映射关系,将data中k1列的值转换为小写。

data['k1']=data['k1'].map({'ONE':'one','TWO':'two'})  
data 
k1k2
0one1
1one1
2one2
3two3
4two3
5two4
6two4

3) 使用lambda表达式表示映射关系,将data中k2列的值加5。

data['k2'] = data['k2'].map(lambda x:x+5)  
data
k1k2
0one6
1one6
2one7
3two8
4two8
5two9
6two9

4) 使用lambda表达式表示映射关系,将data中索引的值加5。

data.index = data.index.map(lambda x:x+5)  
data 
k1k2
5one6
6one6
7one7
8two8
9two8
10two9
11two9

5) 使用lambda表达式表示映射关系,将data中列名转换为大写

data.columns=data.columns.map(str.upper)  
data  
K1K2
5one6
6one6
7one7
8two8
9two8
10two9
11two9

9.数据离散化

from random import randrange  
data=[randrange(100) for _ in range(10)]  
category=[0,25,50,100]  
pd.cut(data,category) 
[(50, 100], (50, 100], (0, 25], (50, 100], (50, 100], (50, 100], (0, 25], (50, 100], (50, 100], (50, 100]]
Categories (3, interval[int64]): [(0, 25] < (25, 50] < (50, 100]]

1) 按category对data数据进行切分,使得参数right=False形成左闭右开区间

pd.cut(data,category,right=False) 
[[50, 100), [50, 100), [0, 25), [50, 100), [50, 100), [50, 100), [0, 25), [50, 100), [50, 100), [50, 100)]
Categories (3, interval[int64]): [[0, 25) < [25, 50) < [50, 100)]

2 )按category对data数据进行切分,使得参数right=False形成左闭右开区间,并对每个区间打标签

labels = ['low', 'middle', 'high']  
pd.cut(data,category,right=False,labels=labels)
['high', 'high', 'low', 'high', 'high', 'high', 'low', 'high', 'high', 'high']
Categories (3, object): ['low' < 'middle' < 'high']

3)对data数据按4分位进行切分。

data  
pd.cut(data,4) 
[(45.5, 66.75], (66.75, 88.0], (2.915, 24.25], (66.75, 88.0], (45.5, 66.75], (66.75, 88.0], (2.915, 24.25], (45.5, 66.75], (66.75, 88.0], (45.5, 66.75]]
Categories (4, interval[float64]): [(2.915, 24.25] < (24.25, 45.5] < (45.5, 66.75] < (66.75, 88.0]]

10.频次统计与位移

1)将df数据通过copy方法赋值为df1,然后对df1数据使用shift方法下移一行(负数表示上移)。

df1=df.copy()  
df1.shift(1)  
ABCDEF
zhangNaNNaTNaNNaNNaNNaN
li12.02013-01-011.03.0testfoo
zhou40.02013-01-022.03.0trainfoo
wang26.02013-01-033.03.0testfoo

2)对df1中D列数据进行直方图统计

df1['D'].value_counts()
3    4
Name: D, dtype: int64

11.透视转换

df = pd.DataFrame({'a':[1,2,3,4],'b':[2,3,4,5],'c':[3,4,5,6], 'd':[3,3,3,3]}) 
df
abcd
01233
12343
23453
34563

1) 将df的a列值作为索引,b列值作为列名,c列值作为值,构建透视图。

df.pivot(index='a', columns='b', values='c')
b2345
a
13.0NaNNaNNaN
2NaN4.0NaNNaN
3NaNNaN5.0NaN
4NaNNaNNaN6.0

2) 将df的a列值作为索引,b列值作为列名,d列值作为值,构建透视图

df.pivot(index='a', columns='b', values='d')
b2345
a
13.0NaNNaNNaN
2NaN3.0NaNNaN
3NaNNaN3.0NaN
4NaNNaNNaN3.0

12.数据差分

1)新建数据帧名为df

df = pd.DataFrame({'a':np.random.randint(1, 100, 10),'b':np.random.randint(1, 100, 10)},index=map(str, range(10)))  
df 
ab
02626
1166
24830
3252
42186
58163
6992
7973
8382
95159

2)对df的行进行一阶差分

df.diff()
ab
0NaNNaN
124.024.0
2-86.0-3.0
35.026.0
456.015.0
57.0-9.0
6-40.0-21.0
7-6.0-42.0
822.061.0
921.0-13.0

3) 对df的列进行一阶差分

df.diff(axis=1)
ab
0NaN-58.0
1NaN-58.0
2NaN25.0
3NaN46.0
4NaN5.0
5NaN-11.0
6NaN8.0
7NaN-28.0
8NaN11.0
9NaN-23.0

4) 对df的行进行二阶差分。

df.diff(periods=2)
ab
0NaNNaN
1NaNNaN
2-62.021.0
3-81.023.0
461.041.0
563.06.0
6-33.0-30.0
7-46.0-63.0
816.019.0
943.048.0

13.计算相关系数

1)新建一个dataframe名为df

df = pd.DataFrame({'A':np.random.randint(1, 100, 10),'B':np.random.randint(1, 100, 10),'C':np.random.randint(1, 100, 10)})
df
ABC
056916
115917
2909262
3223772
4234980
5261089
610137
7454565
8174356
9734844

2) 计算df的相关系数, pearson相关系数

df.corr()
ABC
A1.0000000.4296820.357246
B0.4296821.000000-0.127607
C0.357246-0.1276071.000000

3) 计算df的相关系数, Kendall相关系数

df.corr('kendall')
ABC
A1.0000000.0666670.333333
B0.0666671.000000-0.244444
C0.333333-0.2444441.000000

4) 计算df的相关系数, spearman秩相关

df.corr('spearman')
ABC
A1.0000000.0424240.527273
B0.0424241.000000-0.272727
C0.527273-0.2727271.000000

14.重塑Reshaping

1) 新进一个DataFrame,为名df,将df的前4行赋值给df2.

tuples = list(zip(*[['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]))  
tuples
[('bar', 'one'),
 ('bar', 'two'),
 ('baz', 'one'),
 ('baz', 'two'),
 ('foo', 'one'),
 ('foo', 'two'),
 ('qux', 'one'),
 ('qux', 'two')]
index = pd.MultiIndex.from_tuples(tuples, names=['A', 'B'])  
index
MultiIndex([('bar', 'one'),
            ('bar', 'two'),
            ('baz', 'one'),
            ('baz', 'two'),
            ('foo', 'one'),
            ('foo', 'two'),
            ('qux', 'one'),
            ('qux', 'two')],
           names=['A', 'B'])
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])  
df
AB
AB
barone0.0908150.776030
two1.217861-0.726099
bazone0.801053-1.271264
two0.7854700.514176
fooone-0.066081-0.724912
two-1.9279540.247929
quxone0.0300651.202135
two-0.169432-1.266427
df2 = df[:4]  
df2  
AB
AB
barone0.0908150.776030
two1.217861-0.726099
bazone0.801053-1.271264
two0.7854700.514176

2) 使用stack方法对df2进行列转行,将结果返回给stacked.

stacked = df2.stack()
stacked
A    B     
bar  one  A    0.090815
          B    0.776030
     two  A    1.217861
          B   -0.726099
baz  one  A    0.801053
          B   -1.271264
     two  A    0.785470
          B    0.514176
dtype: float64

3) 使用unstack方法对stacked进行行转列,默认level=2,解压最内层

stacked.unstack()
AB
AB
barone0.0908150.776030
two1.217861-0.726099
bazone0.801053-1.271264
two0.7854700.514176

4) 使用unstack方法对stacked进行列转行,设置level=1,解压中间层

stacked.unstack(1) 
Bonetwo
A
barA0.0908151.217861
B0.776030-0.726099
bazA0.8010530.785470
B-1.2712640.514176

5) 使用unstack方法对stacked进行列转行,默认level=0,解压最外层。

stacked.unstack(0)  
Abarbaz
B
oneA0.0908150.801053
B0.776030-1.271264
twoA1.2178610.785470
B-0.7260990.514176

6) 使用unstack方法对stacked进行列转行,默认level=‘A’,解压最外层

stacked.unstack('A')
Abarbaz
B
oneA0.0908150.801053
B0.776030-1.271264
twoA1.2178610.785470
B-0.7260990.514176

15.melt函数:将DataFrame的列转行。

1) 新建一个DataFrame,名为df

df=pd.DataFrame(np.arange(8).reshape(2,4),index=['AA','BB'],columns=['A','B','C','D'])  
df 
ABCD
AA0123
BB4567

2) 使用melt函数,将df进行列转行操作,保留A,C两个原始列,将B,D两列进行列转行,将列转行的列变量重新命名为B|D,列转行对应变量的值的名称命名为B|D_value 。

pd.melt(df,id_vars=['A','C'],value_vars=['B','D'],var_name='B|D',value_name='(B|D)_value')
ACB|D(B|D)_value
002B1
146B5
202D3
346D7

16.sub函数:截取DataFrame中的行或列。

1) 新建一个DataFrame,名为df

df=pd.DataFrame({ 'one' : pd.Series(np.random.randn(3), index=['a', 'b', 'c']),'two' : pd.Series(np.random.randn(4), index=['a', 'b', 'c', 'd']),'three' : pd.Series(np.random.randn(3), index=['b', 'c', 'd'])}) 
df
onetwothree
a-0.5532440.030308NaN
b0.8273530.143289-0.986206
c-0.313427-0.8751610.074300
dNaN-0.1648810.229687

2)取df中索引为1的行,赋值给row,取列名为two的列赋值给column,使用sub方法将df的row行截取掉,axis='columns’或1。

#取df中索引为1的行,赋值给row  
row=df.iloc[1]  
row
one      0.827353
two      0.143289
three   -0.986206
Name: b, dtype: float64
#取列名为two的列赋值给column  
column=df['two']  
column
a    0.030308
b    0.143289
c   -0.875161
d   -0.164881
Name: two, dtype: float64
#使用sub方法将df的row行截取掉,axis='columns'或1。  
df.sub(row,axis='columns') 
onetwothree
a-1.380597-0.112981NaN
b0.0000000.0000000.000000
c-1.140780-1.0184501.060507
dNaN-0.3081701.215894
df.sub(row,axis=1) 
onetwothree
a-1.380597-0.112981NaN
b0.0000000.0000000.000000
c-1.140780-1.0184501.060507
dNaN-0.3081701.215894

3)使用sub方法将df的column列截取掉,axis='index’或0。

#使用sub方法将df的column列截取掉,axis='index'或0。  
df.sub(column,axis='index') 
onetwothree
a-0.5835530.0NaN
b0.6840630.0-1.129495
c0.5617340.00.949461
dNaN0.00.394568
df.sub(column,axis=0) 
onetwothree
a-0.5835530.0NaN
b0.6840630.0-1.129495
c0.5617340.00.949461
dNaN0.00.394568

17.删除操作

1)删除指定行,返回一个删除后的DataFrame,对原始DataFrame不做改变。

data = pd.DataFrame({'k1':['one'] * 3 + ['two'] * 4,'k2':[1, 1, 2, 3, 3, 4, 4]})  
data  
k1k2
0one1
1one1
2one2
3two3
4two3
5two4
6two4
data.drop(5,axis=0)  
k1k2
0one1
1one1
2one2
3two3
4two3
6two4

2)删除指定行,对data本身进行删除操作。

data.drop(3,inplace=True)  
data  
k1k2
0one1
1one1
2one2
4two3
5two4
6two4

3)删除指定列,返回一个删除后的DataFrame,对原始DataFrame不做改变。

data.drop('k1',axis=1)
k2
01
11
22
43
54
64
### Pandas基本函数及其用法 Pandas 是一种强大的数据分析工具库,广泛应用于数据处理和分析领域。以下是几个常用的基本函数以及它们的具体用法。 #### 1. `pandas-log` 的功能介绍 为了更好地理解 Pandas 中的操作行为,可以借助第三方扩展包 **pandas-log** 来提供操作反馈日志[^1]。该工具通过封装常见的 Pandas 函数,在执行过程中记录额外的日志信息,帮助开发者更清晰地追踪每一步的数据变化过程。 安装方式如下: ```bash pip install git+https://gitcode.com/gh_mirrors/pa/pandas-log.git ``` 使用示例: ```python import pandas as pd from pandas_log import log_dataframe_operations df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) log_df = log_dataframe_operations(df) # 执行任意 Pandas 操作时会自动打印日志 filtered_df = log_df[log_df['A'] > 1] print(filtered_df) ``` --- #### 2. 遍历 DataFrame 行的方法——`iterrows()` 和其他替代方案 Pandas 提供了多种方法用于遍历 DataFrame 数据中的行,其中最常见的是 `iterrows()` 方法[^2]。它能够逐行返回索引和对应的 Series 对象。然而需要注意的是,由于其性能较低,通常不推荐在大规模数据集上频繁调用此方法。 代码示例: ```python import pandas as pd data = {'Column_A': ['X', 'Y'], 'Column_B': [10, 20]} df = pd.DataFrame(data) for idx, row in df.iterrows(): print(f"Index: {idx}, Row Data: {row}") ``` 除了 `iterrows()` 外,还有更高效率的选择比如 `itertuples()` 或者基于向量化运算的 `apply()` 方法。这些方法更适合于需要高性能计算场景下的应用需求。 --- #### 3. 统计描述性信息——`describe()` 函数 对于初步探索数据分布情况而言,`describe()` 是非常实用的一个内置统计汇总命令[^3]。它可以快速生成数值型字段的关键指标(如均值、标准差等),同时也支持自定义参数调整输出范围。 实例演示: ```python sample_data = { 'Scores': [85, 90, None], 'Hours_Studied': [5, 7, 6] } frame = pd.DataFrame(sample_data) summary_stats = frame.describe() print(summary_stats) ``` 注意:如果目标是非数值类型的列,则需显式指定包含选项才能获取相应频率统计等内容。 --- #### 4. 修改列名大小写形式 有时我们可能希望统一表头命名风格以便后续加工处理更加方便一致化管理。下面展示如何利用列表推导表达式实现将现有所有列的名字转换成首字母大写的样式: 样例脚本: ```python raw_columns = ["first_name", "last_name"] cleaned_cols = [col.capitalize() for col in raw_columns] example_dataset = pd.DataFrame({ "first_name": ["John"], "last_name": ["Doe"] }) example_dataset.columns = cleaned_cols print(example_dataset.head()) ``` 上述逻辑同样适用于批量重命名复杂模式匹配条件下多级索引结构等情况。 --- #### 5. 布尔索引筛选特定条件子集 布尔掩码技术允许用户依据某些预设规则轻松提取满足要求的部分记录集合出来单独查看或者进一步深入挖掘潜在规律特性。具体做法就是先创建一个与原始表格形状相同的 True/False 数组作为过滤器作用到原对象之上即可完成整个流程自动化构建工作流简化步骤提升工作效率减少人为错误发生几率增加程序可读性和维护便利程度等方面都有显著优势体现价值所在之处值得推广普及开来让更多人受益匪浅! 简单例子说明如下所示: ```python criteria_mask = (frame['Scores'] >= 88) & (~pd.isnull(frame['Hours_Studied'])) qualified_records = frame.loc[criteria_mask] print(qualified_records) ``` 这里特别强调一点即当涉及到多个并联关系组合查询语句编写时候记得合理运用括号分隔开各个部分优先顺序从而避免语法解析歧义现象产生影响最终结果准确性造成不必要的麻烦困扰等问题出现。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余生羁绊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值