Pandas学习笔记(包括示例代码、运算结果及详细注释)

Python基础——Pandas库超详细介绍+实例分析+附代码 1、创建对象 导入 import pandas as pd import numpy as np 创建Series Series = pd.Series(['a',3,np.nan,np.nan,6,0]) Series 创建一个时间索引dates dates = pd.date_range('2013-01-01',periods = 7) dates 创建DataFrame df =... 阅读详情

Pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。它也是使Python成为强大而高效的数据分析环境的重要因素之一。
若对Numpy不够了解,可以参考我的另一篇博客:https://blog.youkuaiyun.com/strivequeen/article/details/112984264

1.Series

import pandas as pd
import numpy as np
s = pd.Series([1,3,6,np.nan,44,1])
print(s)  # 默认index从0开始,如果想要按照自己的索引设置,则修改index参数,如:index=[3,4,3,7,8,9]
0     1.0
1     3.0
2     6.0
3     NaN
4    44.0
5     1.0
dtype: float64

2.DataFrame的简单运用

DataFrame 既有行索引也有列索引, 它可以被看做由 Series 组成的大字典。

# 指定行标签和列标签的数据
dates = pd.date_range('2021-01-31',periods=6)
# dates = pd.date_range('2021-01-31','2021-02-05') # 起始、结束  与上述等价
'''
numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值。
numpy.random.rand(d0, d1, …, dn)的随机样本位于[0, 1)中。
(6,4)表示6行4列数据
'''
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])

print(df)
                   a         b         c         d
2021-01-31 -0.089777 -0.004411  1.032583  2.570713
2021-02-01 -0.918877  0.600092 -0.711374 -0.087149
2021-02-02  0.000248  0.956044 -0.256532 -2.224948
2021-02-03  1.537203 -1.313810  1.283764 -0.412839
2021-02-04 -0.010970 -0.789566 -0.307353 -0.498532
2021-02-05  0.324443  0.201022  0.956131 -1.140553

print(df['b'])
2021-01-31   -0.004411
2021-02-01    0.600092
2021-02-02    0.956044
2021-02-03   -1.313810
2021-02-04   -0.789566
2021-02-05    0.201022
Freq: D, Name: b, dtype: float64
# 未指定行标签和列标签的数据
df1 = pd.DataFrame(np.arange(12).reshape(3,4))
print(df1)
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

# 另一种方式
df2 = pd.DataFrame({
    'A': [1,2,3,4],
    'B': pd.Timestamp('20210131'),
    'C': pd.Series([1,6,9,10],dtype='float32'),
    'D': np.array([3] * 4,dtype='int32'),
    'E': pd.Categorical(['test','train','test','train']),
    'F': 'foo'
})
print(df2)
   A          B     C  D      E    F
0  1 2021-01-31   1.0  3   test  foo
1  2 2021-01-31   6.0  3  train  foo
2  3 2021-01-31   9.0  3   test  foo
3  4 2021-01-31  10.0  3  train  foo

print(df2.index)
RangeIndex(start=0, stop=4, step=1)

print(df2.columns)
Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')

print(df2.values)
[[1 Timestamp('2021-01-31 00:00:00') 1.0 3 'test' 'foo']
 [2 Timestamp('2021-01-31 00:00:00') 6.0 3 'train' 'foo']
 [3 Timestamp('2021-01-31 00:00:00') 9.0 3 'test' 'foo']
 [4 Timestamp('2021-01-31 00:00:00') 10.0 3 'train' 'foo']]

# 数据总结
print(df2.describe())  # 只对数字数据进行描述
              A          C    D
count  4.000000   4.000000  4.0
mean   2.500000   6.500000  3.0
std    1.290994   4.041452  0.0
min    1.000000   1.000000  3.0
25%    1.750000   4.750000  3.0
50%    2.500000   7.500000  3.0
75%    3.250000   9.250000  3.0
max    4.000000  10.000000  3.0

# 翻转数据
print(df2.T)   # print(np.transpose(df2))为等价操作

                     0                    1                    2  \
A                    1                    2                    3   
B  2021-01-31 00:00:00  2021-01-31 00:00:00  2021-01-31 00:00:00   
C                    1                    6                    9   
D                    3                    3                    3   
E                 test                train                 test   
F                  foo                  foo                  foo   

                     3  
A                    4  
B  2021-01-31 00:00:00  
C                   10  
D                    3  
E                train  
F                  foo  

'''
axis=1表示行
axis=0表示列
默认ascending(升序)为True。ascending=True表示升序,ascending=False表示降序
'''
print(df2.sort_index(axis=1,ascending=True))
   A          B     C  D      E    F
0  1 2021-01-31   1.0  3   test  foo
1  2 2021-01-31   6.0  3  train  foo
2  3 2021-01-31   9.0  3   test  foo
3  4 2021-01-31  10.0  3  train  foo

print(df2.sort_index(axis=1,ascending=False))
     F      E  D     C          B  A
0  foo   test  3   1.0 2021-01-31  1
1  foo  train  3   6.0 2021-01-31  2
2  foo   test  3   9.0 2021-01-31  3
3  foo  train  3  10.0 2021-01-31  4

print(df2.sort_index(axis=0,ascending=False))   # 表示按列降序与按列升序
   A          B     C  D      E    F
3  4 2021-01-31  10.0  3  train  foo
2  3 2021-01-31   9.0  3   test  foo
1  2 2021-01-31   6.0  3  train  foo
0  1 2021-01-31   1.0  3   test  foo

print(df2.sort_index(axis=0,ascending=True))
   A          B     C  D      E    F
0  1 2021-01-31   1.0  3   test  foo
1  2 2021-01-31   6.0  3  train  foo
2  3 2021-01-31   9.0  3   test  foo
3  4 2021-01-31  10.0  3  train  foo

# 对特定列数值排列
print(df2.sort_values(by='C',ascending=False))   # 表示对C列降序排列
   A          B     C  D      E    F
3  4 2021-01-31  10.0  3  train  foo
2  3 2021-01-31   9.0  3   test  foo
1  2 2021-01-31   6.0  3  train  foo
0  1 2021-01-31   1.0  3   test  foo

3.pandas选择数据

3.1 实战筛选

dates = pd.date_range('20210131', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
print(df)
             A   B   C   D
2021-01-31   0   1   2   3
2021-02-01   4   5   6   7
2021-02-02   8   9  10  11
2021-02-03  12  13  14  15
2021-02-04  16  17  18  19
2021-02-05  20  21  22  23

print(df.A)  # 与 print(df['A']) 等价
2021-01-31     0
2021-02-01     4
2021-02-02     8
2021-02-03    12
2021-02-04    16
2021-02-05    20
Freq: D, Name: A, dtype: int32

# 选择跨越多行或多列
print(df[0:3])  # 选取前3行,与 print(df['2021-01-31':'2021-02-02']) 等价
            A  B   C   D
2021-01-31  0  1   2   3
2021-02-01  4  5   6   7
2021-02-02  8  9  10  11

# 根据标签选择数据,获取特定行或列
print(df.loc['20210202'])  # 指定行数据
A     8
B     9
C    10
D    11
Name: 2021-02-02 00:00:00, dtype: int32

# 指定列
print(df.loc[:,'A':'B'])   # 与 print(df.loc[:,['A','B']]) 等价
             A   B
2021-01-31   0   1
2021-02-01   4   5
2021-02-02   8   9
2021-02-03  12  13
2021-02-04  16  17
2021-02-05  20  21

# 行与列同时检索
print(df.loc['20210131',['A','B']])
A    0
B    1
Name: 2021-01-31 00:00:00, dtype: int32

# 根据序列iloc,获取特定位置的值
print(df.iloc[3,1])
13

print(df.iloc[3:5,1:3]) # 不包含末尾5或3,同列表切片
             B   C
2021-02-03  13  14
2021-02-04  17  18

# 跨行操作
print(df.iloc[[1,3,5],1:3])
             B   C
2021-02-01   5   6
2021-02-03  13  14
2021-02-05  21  22

print(df.iloc[:3,[0,2]]) # 混合选择
            A   C
2021-01-31  0   2
2021-02-01  4   6
2021-02-02  8  10

# 通过判断的筛选
print(df[df.A>8])  # 与 print(df.loc[df.A>8]) 等价
             A   B   C   D
2021-02-03  12  13  14  15
2021-02-04  16  17  18  19
2021-02-05  20  21  22  23

3.2 筛选总结

  1. iloc与ix
    相同点:iloc可以取相应的值,操作方便,与ix操作类似。
    不同点:ix可以混合选择,可以填入column对应的字符选择,而iloc只能采用index索引,对于列数较多情况下,ix要方便操作许多。

  2. loc与iloc
    相同点:都可以索引处块数据
    不同点:iloc可以检索对应值,两者操作不同。

3.ix与loc、iloc
ix是混合loc与iloc操作

print(df.loc['20210131','A':'B'])
print(df.iloc[0,0:2])
print(df.ix[0,'A':'B'])
# 以上三种结果均为:
A    0
B    1
Name: 2021-01-31 00:00:00, dtype: int32

4.Pandas设置值

4.1 创建数据

# 创建数据
dates = pd.date_range('20210131',periods=6)
df = pd.DataFrame(np.arange(24).reshape(6,4), index=dates, columns=['A','B','C','D'])
print(df)

             A   B   C   D
2021-01-31   0   1   2   3
2021-02-01   4   5   6   7
2021-02-02   8   9  10  11
2021-02-03  12  13  14  15
2021-02-04  16  17  18  19
2021-02-05  20  21  22  23

4.2 根据位置设置loc和iloc

# 根据位置设置loc和iloc
df.iloc[2,2] = 111
df.loc['20210131','B'] = 2222
print(df)
             A     B    C   D
2021-01-31   0  2222    2   3
2021-02-01   4     5    6   7
2021-02-02   8     9  111  11
2021-02-03  12    13   14  15
2021-02-04  16    17   18  19
2021-02-05  20    21   22  23

4.3 根据条件设置

# 更改B中的数,而更改的位置取决于4的位置,并设相应位置的数为0
df.B[df.A>4] = 0  # 与 df.B.loc[df.A>4] = 0 等价
print(df)
             A     B    C   D
2021-01-31   0  2222    2   3
2021-02-01   4     5    6   7
2021-02-02   8     0  111  11
2021-02-03  12     0   14  15
2021-02-04  16     0   18  19
2021-02-05  20     0   22  23

4.4 按行或列设置

df['F'] = np.nan   # 列批处理,F列全改为NaN
print(df)
             A     B    C   D   F
2021-01-31   0  2222    2   3 NaN
2021-02-01   4     5    6   7 NaN
2021-02-02   8     0  111  11 NaN
2021-02-03  12     0   14  15 NaN
2021-02-04  16     0   18  19 NaN
2021-02-05  20     0   22  23 NaN

4.5 添加Series序列(长度必须对齐)

df['E'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20210131',periods=6))
print(df)
             A     B    C   D   F  E
2021-01-31   0  2222    2   3 NaN  1
2021-02-01   4     5    6   7 NaN  2
2021-02-02   8     0  111  11 NaN  3
2021-02-03  12     0   14  15 NaN  4
2021-02-04  16     0   18  19 NaN  5
2021-02-05  20     0   22  23 NaN  6

4.6 设定某行某列为特定值

#ix 以后要剥离了,尽量不要用了

df.loc['20210131','A'] = 67  # 与 df.iloc[0,0] = 67 等价
print(df)
             A     B    C   D   F  E
2021-01-31  67  2222    2   3 NaN  1
2021-02-01   4     5    6   7 NaN  2
2021-02-02   8     0  111  11 NaN  3
2021-02-03  12     0   14  15 NaN  4
2021-02-04  16     0   18  19 NaN  5
2021-02-05  20     0   22  23 NaN  6

4.7 修改一整行数据

df.iloc[1] = np.nan # df.iloc[1,:]=np.nan
print(df)
               A       B      C     D   F    E
2021-01-31  67.0  2222.0    2.0   3.0 NaN  1.0
2021-02-01   NaN     NaN    NaN   NaN NaN  NaN
2021-02-02   8.0     0.0  111.0  11.0 NaN  3.0
2021-02-03  12.0     0.0   14.0  15.0 NaN  4.0
2021-02-04  16.0     0.0   18.0  19.0 NaN  5.0
2021-02-05  20.0     0.0   22.0  23.0 NaN  6.0

df.loc['20210131'] = np.nan # df.loc['20210131,:']=np.nan
print(df)
               A    B      C     D   F    E
2021-01-31   NaN  NaN    NaN   NaN NaN  NaN
2021-02-01   NaN  NaN    NaN   NaN NaN  NaN
2021-02-02   8.0  0.0  111.0  11.0 NaN  3.0
2021-02-03  12.0  0.0   14.0  15.0 NaN  4.0
2021-02-04  16.0  0.0   18.0  19.0 NaN  5.0
2021-02-05  20.0  0.0   22.0  23.0 NaN  6.0

5.Pandas处理丢失数据

5.1 创建含NaN的矩阵

# 创建含NaN的矩阵
dates = pd.date_range('20210131',periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D']) 
print(df)
             A   B   C   D
2021-01-31   0   1   2   3
2021-02-01   4   5   6   7
2021-02-02   8   9  10  11
2021-02-03  12  13  14  15
2021-02-04  16  17  18  19
2021-02-05  20  21  22  23

# a.reshape(6,4)等价于a.reshape((6,4))
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
print(df)
             A     B     C   D
2021-01-31   0   NaN   2.0   3
2021-02-01   4   5.0   NaN   7
2021-02-02   8   9.0  10.0  11
2021-02-03  12  13.0  14.0  15
2021-02-04  16  17.0  18.0  19
2021-02-05  20  21.0  22.0  23

5.2 删除有NaN的行或列

print(df.dropna()) # 默认是删除掉含有NaN的行
             A     B     C   D
2021-02-02   8   9.0  10.0  11
2021-02-03  12  13.0  14.0  15
2021-02-04  16  17.0  18.0  19
2021-02-05  20  21.0  22.0  23

print(df.dropna(
    axis=0, # 0对行进行操作;1对列进行操作
    how='any' # 'any':只要存在NaN就drop掉;'all':必须全部是NaN才drop
))
# 结果同上

# 删除掉所有含有NaN的列
print(df.dropna(
    axis=1,
    how='any'
))
             A   D
2021-01-31   0   3
2021-02-01   4   7
2021-02-02   8  11
2021-02-03  12  15
2021-02-04  16  19
2021-02-05  20  23

5.3 替换NaN值为0或者其他

print(df.fillna(value=0))
             A     B     C   D
2021-01-31   0   0.0   2.0   3
2021-02-01   4   5.0   0.0   7
2021-02-02   8   9.0  10.0  11
2021-02-03  12  13.0  14.0  15
2021-02-04  16  17.0  18.0  19
2021-02-05  20  21.0  22.0  23

5.4 是否有缺失数据NaN

print(df.isnull())  # 与 print(df.isna()) 等价
                A      B      C      D
2021-01-31  False   True  False  False
2021-02-01  False  False   True  False
2021-02-02  False  False  False  False
2021-02-03  False  False  False  False
2021-02-04  False  False  False  False
2021-02-05  False  False  False  False

# 检测某列是否有缺失数据NaN
print(df.isnull().any())
A    False
B     True
C     True
D    False
dtype: bool

# 检测数据中是否存在NaN,如果存在就返回True
print(np.any(df.isnull())==True)
True

6.Pandas导入导出

6.1 导入数据

import pandas as pd # 加载模块
data = pd.read_csv('student.csv') # 读取csv
print(data) # 打印出data
    Student ID  name   age  gender
0         1100  Kelly   22  Female
1         1101    Clo   21  Female
2         1102  Tilly   22  Female
3         1103   Tony   24    Male
4         1104  David   20    Male
5         1105  Catty   22  Female
6         1106      M    3  Female
7         1107      N   43    Male
8         1108      A   13    Male
9         1109      S   12    Male
10        1110  David   33    Male
11        1111     Dw    3  Female
12        1112      Q   23    Male
13        1113      W   21  Female

print(data.head(3)) # 前三行
   Student ID  name   age  gender
0        1100  Kelly   22  Female
1        1101    Clo   21  Female
2        1102  Tilly   22  Female

print(data.tail(3)) # 后三行
    Student ID name   age  gender
11        1111    Dw    3  Female
12        1112     Q   23    Male
13        1113     W   21  Female

6.2 导出数据

# 将资料存取成pickle
data.to_pickle('student.pickle')
# 读取pickle文件并打印
print(pd.read_pickle('student.pickle'))

7.Pandas合并操作

7.1 Pandas合并

7.1.1 concat

# 定义资料集
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])
print(df1)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0

print(df2)
     a    b    c    d
0  1.0  1.0  1.0  1.0
1  1.0  1.0  1.0  1.0
2  1.0  1.0  1.0  1.0

print(df3)
     a    b    c    d
0  2.0  2.0  2.0  2.0
1  2.0  2.0  2.0  2.0
2  2.0  2.0  2.0  2.0

# concat纵向合并
res = pd.concat([df1,df2,df3],axis=0)
print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
0  1.0  1.0  1.0  1.0
1  1.0  1.0  1.0  1.0
2  1.0  1.0  1.0  1.0
0  2.0  2.0  2.0  2.0
1  2.0  2.0  2.0  2.0
2  2.0  2.0  2.0  2.0

# 上述合并过程中,index重复,重置index方法:只需要将index_ignore设定为True即可
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True)
print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  1.0  1.0  1.0  1.0
4  1.0  1.0  1.0  1.0
5  1.0  1.0  1.0  1.0
6  2.0  2.0  2.0  2.0
7  2.0  2.0  2.0  2.0
8  2.0  2.0  2.0  2.0

# join 合并方式
#定义资料集
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])
print(df1)
     a    b    c    d
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  0.0  0.0  0.0  0.0
print(df2)
     b    c    d    e
2  1.0  1.0  1.0  1.0
3  1.0  1.0  1.0  1.0
4  1.0  1.0  1.0  1.0

'''
join='outer',函数默认为join='outer'。此方法是依照column来做纵向合并,有相同的column上下合并在一起,
其他独自的column各自成列,原来没有值的位置皆为NaN填充。
'''
# 纵向"外"合并df1与df2
res = pd.concat([df1,df2],axis=0,join='outer')
print(res)
     a    b    c    d    e
1  0.0  0.0  0.0  0.0  NaN
2  0.0  0.0  0.0  0.0  NaN
3  0.0  0.0  0.0  0.0  NaN
2  NaN  1.0  1.0  1.0  1.0
3  NaN  1.0  1.0  1.0  1.0
4  NaN  1.0  1.0  1.0  1.0

# 修改index
res = pd.concat([df1,df2],axis=0,join='outer',ignore_index=True)
print(res)
     a    b    c    d    e
0  0.0  0.0  0.0  0.0  NaN
1  0.0  0.0  0.0  0.0  NaN
2  0.0  0.0  0.0  0.0  NaN
3  NaN  1.0  1.0  1.0  1.0
4  NaN  1.0  1.0  1.0  1.0
5  NaN  1.0  1.0  1.0  1.0

# join='inner'合并相同的字段,纵向"内"合并df1与df2
res = pd.concat([df1,df2],axis=0,join='inner')
print(res)
     b    c    d
1  0.0  0.0  0.0
2  0.0  0.0  0.0
3  0.0  0.0  0.0
2  1.0  1.0  1.0
3  1.0  1.0  1.0
4  1.0  1.0  1.0

# join_axes(依照axes合并)
#定义资料集
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])
print(df1)
     a    b    c    d
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  0.0  0.0  0.0  0.0
print(df2)
     b    c    d    e
2  1.0  1.0  1.0  1.0
3  1.0  1.0  1.0  1.0
4  1.0  1.0  1.0  1.0

# 横向合并
res = pd.concat([df1,df2],axis=1)
print(res)
     a    b    c    d    b    c    d    e
1  0.0  0.0  0.0  0.0  NaN  NaN  NaN  NaN
2  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
3  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
4  NaN  NaN  NaN  NaN  1.0  1.0  1.0  1.0

7.1.2 append添加数据

# append只有纵向合并,没有横向合并
#定义资料集
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])
s1 = pd.Series([1,2,3,4], index=['a','b','c','d'])
# 将df2合并到df1下面,以及重置index,并打印出结果
res = df1.append(df2,ignore_index=True)
print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  1.0  1.0  1.0  1.0
4  1.0  1.0  1.0  1.0
5  1.0  1.0  1.0  1.0

# 合并多个df,将df2与df3合并至df1的下面,以及重置index,并打印出结果
res = df1.append([df2,df3], ignore_index=True)
print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  1.0  1.0  1.0  1.0
4  1.0  1.0  1.0  1.0
5  1.0  1.0  1.0  1.0
6  2.0  2.0  2.0  2.0
7  2.0  2.0  2.0  2.0
8  2.0  2.0  2.0  2.0

# 合并series,将s1合并至df1,以及重置index,并打印结果
res = df1.append(s1,ignore_index=True)
print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  1.0  2.0  3.0  4.0

7.1.3 两种常用合并方式总结

res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
res1 = df1.append([df2, df3], ignore_index=True)
# 上述两种结果一样:
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  1.0  1.0  1.0  1.0
4  1.0  1.0  1.0  1.0
5  1.0  1.0  1.0  1.0
6  2.0  2.0  2.0  2.0
7  2.0  2.0  2.0  2.0
8  2.0  2.0  2.0  2.0

7.2.Pandas 合并 merge

7.2.1 定义资料集并打印

# 依据一组key合并
# 定义资料集并打印出
left = pd.DataFrame({'key' : ['K0','K1','K2','K3'],
                     'A' : ['A0','A1','A2','A3'],
                     'B' : ['B0','B1','B2','B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C' : ['C0', 'C1', 'C2', 'C3'],
                      'D' : ['D0', 'D1', 'D2', 'D3']})
print(left)
  key   A   B
0  K0  A0  B0
1  K1  A1  B1
2  K2  A2  B2
3  K3  A3  B3
print(right)
  key   C   D
0  K0  C0  D0
1  K1  C1  D1
2  K2  C2  D2
3  K3  C3  D3

7.2.2 依据key column合并

res = pd.merge(left,right,on='key')
print(res)
  key   A   B   C   D
0  K0  A0  B0  C0  D0
1  K1  A1  B1  C1  D1
2  K2  A2  B2  C2  D2
3  K3  A3  B3  C3  D3

7.2.3 两列合并

#  依据两组key合并
#定义资料集并打印出
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                      'key2': ['K0', 'K1', 'K0', 'K1'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                       'key2': ['K0', 'K0', 'K0', 'K0'],
                       'C': ['C0', 'C1', 'C2', 'C3'],
                       'D': ['D0', 'D1', 'D2', 'D3']})
print(left)
  key1 key2   A   B
0   K0   K0  A0  B0
1   K0   K1  A1  B1
2   K1   K0  A2  B2
3   K2   K1  A3  B3
print(right)
  key1 key2   C   D
0   K0   K0  C0  D0
1   K1   K0  C1  D1
2   K1   K0  C2  D2
3   K2   K0  C3  D3

# 依据key1与key2 columns进行合并,并打印出四种结果['left', 'right', 'outer', 'inner']
res = pd.merge(left, right, on=['key1', 'key2'], how='inner')
print(res)
  key1 key2   A   B   C   D
0   K0   K0  A0  B0  C0  D0
1   K1   K0  A2  B2  C1  D1
2   K1   K0  A2  B2  C2  D2

res = pd.merge(left, right, on=['key1', 'key2'], how='outer')
print(res)
  key1 key2    A    B    C    D
0   K0   K0   A0   B0   C0   D0
1   K0   K1   A1   B1  NaN  NaN
2   K1   K0   A2   B2   C1   D1
3   K1   K0   A2   B2   C2   D2
4   K2   K1   A3   B3  NaN  NaN
5   K2   K0  NaN  NaN   C3   D3

res = pd.merge(left, right, on=['key1', 'key2'], how='left')
print(res)
  key1 key2   A   B    C    D
0   K0   K0  A0  B0   C0   D0
1   K0   K1  A1  B1  NaN  NaN
2   K1   K0  A2  B2   C1   D1
3   K1   K0  A2  B2   C2   D2
4   K2   K1  A3  B3  NaN  NaN

res = pd.merge(left, right, on=['key1', 'key2'], how='right')
print(res)
  key1 key2    A    B   C   D
0   K0   K0   A0   B0  C0  D0
1   K1   K0   A2   B2  C1  D1
2   K1   K0   A2   B2  C2  D2
3   K2   K0  NaN  NaN  C3  D3

7.2.4 Indicator设置合并列名称

df1 = pd.DataFrame({'col1':[0,1],'col_left':['a','b']})
df2 = pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})
print(df1)
   col1 col_left
0     0        a
1     1        b
print(df2)
   col1  col_right
0     1          2
1     2          2
2     2          2

# 依据col1进行合并,并启用indicator=True,最后打印
res = pd.merge(df1,df2,on='col1',how='outer',indicator=True)
print(res)
   col1 col_left  col_right      _merge
0     0        a        NaN   left_only
1     1        b        2.0        both
2     2      NaN        2.0  right_only
3     2      NaN        2.0  right_only

# 自定义indicator column的名称,并打印出
res = pd.merge(df1,df2,on='col1',how='outer',indicator='indicator_column')
print(res)
   col1 col_left  col_right indicator_column
0     0        a        NaN        left_only
1     1        b        2.0             both
2     2      NaN        2.0       right_only
3     2      NaN        2.0       right_only

7.2.5 依据index合并

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                     'B': ['B0', 'B1', 'B2']},
                     index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
                      'D': ['D0', 'D2', 'D3']},
                     index=['K0', 'K2', 'K3'])
print(left)
     A   B
K0  A0  B0
K1  A1  B1
K2  A2  B2
print(right)
     C   D
K0  C0  D0
K2  C2  D2
K3  C3  D3

# 依据左右资料集的index进行合并,how='outer',并打印
res = pd.merge(left,right,left_index=True,right_index=True,how='outer')
print(res)
      A    B    C    D
K0   A0   B0   C0   D0
K1   A1   B1  NaN  NaN
K2   A2   B2   C2   D2
K3  NaN  NaN   C3   D3

# 依据左右资料集的index进行合并,how='inner',并打印
res = pd.merge(left,right,left_index=True,right_index=True,how='inner')
print(res)
     A   B   C   D
K0  A0  B0  C0  D0
K2  A2  B2  C2  D2

7.2.6 解决overlapping的问题

boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
print(boys)
    k  age
0  K0    1
1  K1    2
2  K2    3
print(girls)
    k  age
0  K0    4
1  K0    5
2  K3    6

# 使用suffixes解决overlapping的问题
# 比如将上面两个合并时,age重复了,则可通过suffixes设置,以此保证不重复,不同名
res = pd.merge(boys,girls,on='k',suffixes=['_boy','_girl'],how='inner')
print(res)
    k  age_boy  age_girl
0  K0        1         4
1  K0        1         5

8.Pandas plot出图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.Series(np.random.randn(1000), index=np.arange(1000))
print(data)
0     -0.090306
1      0.537896
2      0.577394
3      0.298975
4     -0.506510
         ...   
995    0.243735
996    0.462577
997    0.054838
998   -0.514172
999   -0.592451
Length: 1000, dtype: float64

print(data.cumsum())
0      -0.090306
1       0.447590
2       1.024985
3       1.323960
4       0.817450
         ...    
995    20.989576
996    21.452154
997    21.506992
998    20.992820
999    20.400369
Length: 1000, dtype: float64

# data本来就是一个数据,所以我们可以直接plot
data.plot()
plt.show()

在这里插入图片描述

# np.random.randn(1000,4) 随机生成1000行4列数据
# list("ABCD")会变为['A','B','C','D']
data = pd.DataFrame(
    np.random.randn(1000,4),
    index=np.arange(1000),
    columns=list("ABCD")
)
data.cumsum()
data.plot()
plt.show()

在这里插入图片描述

ax = data.plot.scatter(x='A',y='B',color='DarkBlue',label='Class1')
# 将之下这个 data 画在上一个 ax 上面
data.plot.scatter(x='A',y='C',color='LightGreen',label='Class2',ax=ax)
plt.show()

在这里插入图片描述

【第1章Pandas DataFrame基础】深度解析:如何在 Pandas DataFrame 中排除法定节假日(附详细代码示例) Pandas 是一个强大的 Python 数据分析库,它提供了大量用于数据操作和分析的工具。Pandas 的核心数据结构是Series和DataFrame,其中DataFrame类似于二维表格,可以存储不同类型的数据,并支持多种数据操作。# 定义法定节假日。 阅读详情

相关推荐

Pandas库相关用法总结【万字梳理,用法描述+代码示例结果,详细实用!

A B C**(3)将dataframe转换为dict对象*** dataframe转换为dict对象本质为提取其中的某一行/或一列数据,其转换过程仍然是通过先得到series对象,再转换为dict对象* 从dataframe提取行数据/列数据的方法和介绍详见第六节~series_obj = df1.iloc[0] # 取dataframe中的第一行数据,得到的是series,行标签为列名。

m0_60607895的博客 1216

pandas常用指令的详细解释,附代码和数据集

数据挖掘pandas常用指令的详细解释,附代码和数据集相关包的导入数据集的显示:数据集的排序数据集的获取函数应用到具体单元格,行,列缺失值的处理数据集的导入导出导入导出结束语 pandas常用指令的详细解释,附代码和数据集 相关包的导入 使用的为pandas和numpy,两个包的关联系十分的大 import numpy as np import pandas as pd import warnings warnings.filterwarnings('ignore') '''Python的警告信息有时候很烦

Harrison_cqq的博客 1201

【Pandas】pandas DataFrame rsub

`pandas.DataFrame.rsub` 方法用于执行反向减法运算。具体来说,它相当于调用 `other - self`,其中 `self` 是调用该方法的 DataFrame。以下是该方法的参数说明及其功能:

weixin_39648905的博客 1076

数据分析利器:pandas库的奥秘与代码示例

pandas库在数据分析与处理方面具有诸多优势,包括简单易用、功能强大、高效稳定等。通过本文的介绍,读者可以了解到pandas的基本概念、基础知识、高级特性以及实战案例。在使用pandas进行数据分析时,掌握这些基本概念和操作方法可以大大提高工作效率和数据分析的准确性。同时,结合实际案例,可以帮助读者更好地理解pandas的应用场景和实际效果。总之,pandas是一个非常实用的数据分析库,对于数据分析师、数据科学家等职业人士具有重要意义。

分享型博主 451

【Pandas】pandas DataFrame radd

`pandas.DataFrame.radd` 方法用于执行反向加法运算。具体来说,它相当于调用 `other + self`,其中 `self` 是调用该方法的 DataFrame。以下是该方法的参数说明及其功能:

weixin_39648905的博客 1014

Pandas中的分组级运算

一、数据转换           使用agg()方法进行聚合运算时,返回的数据集的形状(shape)与被分组数据集的形状是不一样的,如果希望保持与原数据集形状相同,那么可以通过transfrom()方法实现。transfrom方法的语法格式如下:         transfrom(func,*args,**kwargs) 上述方

KJ.JK 8372

【pandas 类库】

Pandas 是 Python 语言的一个扩展程序库,用于数据分析。 Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。 Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)。 Pandas 一个强大的分析结构化数据的工具集,基础是Numpy(提供高性能的矩阵运算)。 Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入.

zhurrm的博客 3315

知识图谱中的 Ontology(本体论)

本文的部分图片和内容来自中国科学院自动化研究所刘康老师的课件 Ontology(本体论) Ontology 是(特定领域)信息组织的一种形式,是领域知识规范的抽象和描述,是表达、共享、重用知识的方法。 Ontology 是知识体系构建的关键技术,知识图谱是一种人工智能技术,它的关键在于让计算机能够处理人类的知识。然而,人类脑海中的知识通常是直觉性的,我们无法将这种直觉性的知识直接输入给计算机,On...

P01son的博客 2万+

pandas基础语法

df_inner['price'].corr(df_inner['m-point']) #相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关。df_inner.iloc[:3,:2] #冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从0开始,前三行,前两列。1.字典对应值是列表:{'name':['a','b','c'],'age':[12,14,16]}2、method参数的取值:{'pad','ffill','backfill','bfill','None'}

qh075的博客 2922

本地部署大模型 vs 网页版大模型区别

fill:#333;color:#333;color:#333;fill:none;本地服务器/工作站硬件资源私有化部署GPU集群高速存储模型文件训练框架推理引擎。

Ds-Rag的博 1712

2024年中科大分子生物研究生考试建议

分子生物学复习资料及往年考题。

qq_43337249的博客 2955

pandas函数注释

data = pd.DataFrame(pd.read_excel(path,sheet_name=‘Left’,header=1,converters={‘A’: str})) # converters={‘A’: str} 设置A列格式为文本。data=data.reindex(columns=[‘商品名称’, ‘规格’, ‘对应车型类别’, ‘备注’, ‘新增的一列’], fill_value=‘新增的一列要填的值’)

Lsnsn的博客 915

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 151

Pandas库相关用法总结【万字梳理,用法描述+代码示例结果,详细实用!】

本文总结归纳了使用pandas库对dataframe格式数据进行各类预处理、统计、和分析过程中常用的一些函数和应用场景,希望能帮助看到的小伙伴在日常调试时少走弯路。

TFY_Newone的博客 2734

【LE Audio】CAP精讲[1]: 从理论到实操,CAP 协同流程入门全攻略

LEAudio生态中的CommonAudioProfile(CAP)是一个关键协同框架,它通过整合基础音频协议(BAP/VCP/MICP等)构建多设备协同能力。CAP定义了三大核心功能:音频流管理、设备组控制和统一交互服务,解决了传统蓝牙音频在多设备场景下的协同痛点。其规范历经v1.0到v1.0.1的优化,修正了角色定义、连接流程等关键模块,提升设备兼容性。CAP采用严格的语言约定(shall/must/should)和术语体系(ContextType/CCID/协同集),确保不同厂商设备能相互理解。

byte轻骑兵的技术小窝 2万+

(汇总篇)语义SLAM相关开源方案| 全球优秀作者与实验室 | SLAM学习资料整理

SLAM 与深度学习相结合的工作当前主要体现在两个方面,一方面是将语义信息参与到建图、位姿估计等环节中,另一方面是端到端地完成 SLAM。针对建图的工作一方面是利用几何信息进行稠密重建,另一方面很多工作利用语义信息达到了很好的语义重建效果,三维重建、SFM。动态 SLAM 也是一个很值得研究的话题,这里不太好分类,很多工作用到了语义信息或者用来三维重建,收集的方案相对较少。优化可能是 SLAM 中最难的一部分了吧 +_+ ,一般都是直接用现成的因子图、图优化方案,要创新可不容易。

熊猫小妖的AI世界 7870

【Python三方库】Python之Pandas库的简介、安装、使用方法、示例代码、注意事项等详细攻略

Python之Pandas库的简介、安装、使用方法、示例代码、注意事项等详细攻略

科技改变人类,技术成就未来 6278

在windows中安装并启动ActiveMQ5.16.2

打开ActiveMQ官网 下载ActiveMQ 点击apache-activemq-5.16.2-bin.zip进行下载 下载发后解压到c盘根目录下 在powershell中输入 ./activemq start启动 ActiveMQ服务 htpp://127.0.0.1:8161访问ActiveMQ控制台 ...

934

Pandas聚合运算和分组运算的实现示例

这篇文章主要介绍了Pandas聚合运算和分组运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们可以参考一下: 1.聚合运算 (1)使用内置的聚合运算函数进行计算 1>内置的聚合运算函数 sum(),mean(),max(),min(),size(),describe()...等等 2>应用聚合运算函数进行计算 impo...

lamehd的博客 398

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2976

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Pandas中的逻辑运算符(与或非)及Python代码示例

Pandas是Python中一个非常流行的用于数据处理和分析的库,它提供了大量的函数和操作符,以便用户可以方便地对数据进行操纵。坚持已实践为主,手把手带你做项目,打比赛,写论文。然后,它使用逻辑运算符选择所有年龄大于50岁且收入大于100,000美元的人,并将结果存储在变量“result”中。在这个例子中,我们选择了所有年龄小于20或大于50岁的人,并将结果存储在变量“result”中。上面的代码使用“~”运算符来对原始条件进行否定,以选择所有不是美国公民的人,并将结果存储在变量“result”中。

Tina姐的博客 3154

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Pandas:数据运算

可以使用 `agg()` 方法将多个聚合函数应用于一个 DataFrame。# 自定义聚合操作print("自定义聚合结果:\n", custom_agg)在 Pandas 中,自定义运算允许用户通过定义自己的函数来对 `DataFrame` 或 `Series` 中的数据进行处理和计算。这种灵活性使得用户能够实现特定需求的计算。以下是一些常见的自定义运算示例及其使用方式。

Wei_sx的博客 1250

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

pandas 中 Series 运算汇总

对于长度不同的Series进行计算时,Pandas的处理方式是非常智能的,它通过自动对齐索引并用NaN填充缺失值,保证了计算的可行性和结果的准确性。这使得Pandas在处理实际工作中遇到的不规则数据时显得格外强大和灵活。在金融分析中,经常需要对齐交易数据,比如股票的日交易数据,尤其是在合并多个股票数据进行比较时。在科研数据处理中,例如生物信息学或气象数据分析,数据的时间点可能不完全一致,此时这种对齐方式极为重要。在商业智能中,处理销售数据或用户行为数据时,需要对产品线不同阶段的数据进行整合分析。

weixin_47552266的博客 1760

数据分析之Pandas(四)DataFrame运算

本章内容 算术运算 逻辑运算 统计运算 累计统计函数 自定义运算 第一节 算术运算 add(other) 比如进行数学运算加上具体的一个数字 sub(other) 如果想要得到每天的涨跌大小?求出每天 close- open价格差 第二节 逻辑运算 逻辑运算符号<、 >、|、 & 逻辑运算类型:>, >=, <, <=, ==, !=

提莫君的博客 1万+

小易的Pandas学习笔记

结构特点:DataFrame 是一个表格型的数据结构,具有行标签(index)和列标签(columns),也被称为异构数据表,即每列的数据类型可以不同,如字符串、整型、浮点型等。各参数含义data一组数据 ,可以是多种数据类型,如 ndarray、series、map、lists、dict 等。index索引值(即行标签)。columns列标签,默认为RangeIndexdtype数据类型。copy默认为 False,表示复制数据data。与 Series 的关系。

小易的博客 1084

pandas学习笔记PDF超详细

pandas学习笔记PDF超详细 【下载地址】pandas学习笔记PDF超详细 这本pandas学习笔记PDF是数据科学爱好者的必备指南,内容详尽且易于理解。从基础知识到高级应用,涵盖了pandas库的各个方面,帮助用户快速掌握数据处理、分析和可视化技能。笔记结构清晰,配有丰富的实例讲解,适合不同水平的开发者学习。无论您...

gitblog_06749的博客 575
上一篇: Python基础——集合
下一篇: python读取写入pickle、npy格式文件(代码+注释)
StriveQueen
博客等级 码龄8年 98粉丝 160原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值