目录

一、DataFrame对象的创建

1、根据列表创建:

情况1:由二维列表

情况2:由元组tuple组成的列表

情况3:由字典dict组成的列表

情况4:由数组array组成的列表

情况5:由序列series组成的列表

2、根据字典创建:

情况1:由元组tuple组成的字典

情况2:由列表list组成的字典

情况3:由字典dict组成的字典

情况4:由数组array组成的字典

情况5:由序列series组成的字典

情况6:由复合式的字典

3、根据二维数组ndarray创建:

二、DataFrame常用属性

三、DataFrame的访问

1、读取dataframe表中的行

2、读取dataframe表中的列

3、读取dataframe表中的元素

4、条件读取

四、DataFrame数据修改

1、修改DataFrame表中的行

2、修改DataFrame表中的列

3、修改DataFrame表中的元素

五、遍历

1、iterrows(): 按行遍历

2、itertuples(): 按行遍历

3、iteritems():按列遍历


一、DataFrame对象的创建

1、根据列表创建:

行索引是index,列索引是columns

情况1:由二维列表

默认的 index 和 columns

import pandas as pd

data = [['张三', 23, '男'], ['李四', 27, '女'], ['王二', 26, '女']]
df = pd.DataFrame(data)
print(df)

运行结果:

0 1 2

0 张三 23 男

1 李四 27 女

2 王二 26 女

指定索引ndex 和 columns值:

import pandas as pd

data = [['张三', 23, '男'], ['李四', 27, '女'], ['王二', 26, '女']]
df = pd.DataFrame(data, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c'])
print(df)

运行结果:

姓名 年龄 性别

a 张三 23 男

b 李四 27 女

c 王二 26 女

情况2:由元组tuple组成的列表

import pandas as pd

data = [('张三', 23, '男'), ('李四', 27, '女'), ('王二', 26, '女')]
df = pd.DataFrame(data, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c'])
print(df)

运行结果:

姓名 年龄 性别

a 张三 23 男

b 李四 27 女

c 王二 26 女

情况3:由字典dict组成的列表

import pandas as pd

data = [
    {'姓名': '张三', '年龄': 23, '性别': '男'}, 
    {'姓名': '李四', '年龄': 27, '性别': '男'},
    {'姓名': '王二', '年龄': 26}
]
# 缺少的值自动添加NaN
df = pd.DataFrame(data)
print(df)

运行结果:

姓名 年龄 性别

0 张三 23 男

1 李四 27 男

2 王二 26 NaN

情况4:由数组array组成的列表

import pandas as pd
import numpy as np

data = [
    np.array(('张三', 23, '男')),
    np.array(('李四', 27, '女')),
    np.array(('王二', 26, '女'))
]
df = pd.DataFrame(data, columns=['姓名', '年龄', '性别'])
print(df)

运行结果:

姓名 年龄 性别

0 张三 23 男

1 李四 27 女

2 王二 26 女

import pandas as pd
import numpy as np

data = [
    np.array(('张三', '李四', '王二')),
    np.array((23, 27, 26)),
    np.array(('男', '女', '女'))
]
df = pd.DataFrame(data, index=['姓名', '年龄', '性别'])
print(df)

运行结果:

0 1 2

姓名 张三 李四 王二

年龄 23 27 26

性别 男 女 女

情况5:由序列series组成的列表

import pandas as pd

data = [
    pd.Series(['张三', '李四', '王二'], index=['a', 'b', 'c']),
    pd.Series([23, 27], index=['a', 'b']),
    pd.Series(['男', '女', '女'], index=['a', 'b', 'c'])
]
# 序列里的index作为dataframe表的columns索引
# 缺少值自动添加NaN
df = pd.DataFrame(data, index=['姓名', '年龄', '性别'])
print(df)

运行结果:

a b c

姓名 张三 李四 王二

年龄 23.0 27.0 NaN

性别 男 女 女

2、根据字典创建:

该字典必须满足:每一个key对应的value长度都相同:

情况1:由元组tuple组成的字典

import pandas as pd

data = {
    '姓名': ('张三', '李四', '王二'), 
    '年龄': (23, 27, 26), 
    '性别': ('男', '女', '女')
}
df = pd.DataFrame(data)
print(df)

运行结果:

姓名 年龄 性别

0 张三 23 男

1 李四 27 女

2 王二 26 女

情况2:由列表list组成的字典

import pandas as pd

data = {
    '姓名': ['张三', '李四', '王二'], 
    '年龄': [23, 27, 26],
    '性别': ['男', '女', '女']
}
df = pd.DataFrame(data)
print(df)

运行结果:

姓名 年龄 性别

0 张三 23 男

1 李四 27 女

2 王二 26 女

情况3:由字典dict组成的字典

import pandas as pd

data = {'姓名': {'1': '张三', '2': '李四', '3': '王二'},
        '年龄': {'1': 23, '2': 27, '3': 26},
        '性别': {'1': '男', '2': '女', '3': '女'}
        }
# data.key 作为datafreme表的columns;
# data.value中的key 作为dataframe表的index
df = pd.DataFrame(data)
print(df)

运行结果:

姓名 年龄 性别

1 张三 23 男

2 李四 27 女

3 王二 26 女

情况4:由数组array组成的字典

import pandas as pd
import numpy as np

data = {
    '姓名': np.array(('张三', '李四', '王二')), 
    '年龄': np.array((23, 27, 26)), 
    '性别': np.array(('男', '女', '女'))
}
df = pd.DataFrame(data)
print(df)

运行结果:

姓名 年龄 性别

0 张三 23 男

1 李四 27 女

2 王二 26 女

情况5:由序列series组成的字典

import pandas as pd

data = {
    '姓名': pd.Series(['张三', '李四', '王二'], index=['a', 'b', 'c']), 
    '年龄': pd.Series([23, 27], index=['a', 'b'])
}  
# 序列里的index作为dataframe表的index索引
# 字典里的key作为dataframe表的columns索引
df = pd.DataFrame(data)
print(df)

运行结果:

姓名 年龄

a 张三 23.0

b 李四 27.0

c 王二 NaN

情况6:由复合式的字典

import pandas as pd

data = {'单位': '1', '姓名': ['张三', '李四', '王二'], '年龄': [23, 27, 26], '性别': ['男', '女', '女']}
# 每行的单位列自动添加
df = pd.DataFrame(data)
print(df)

运行结果:

单位 姓名 年龄 性别

0 1 张三 23 男

1 1 李四 27 女

2 1 王二 26 女

3、根据二维数组ndarray创建:

import pandas as pd
import numpy as np

array1 = np.array([['张三', 23, '男'], ['李四', 27, '女'], ['王二', 26, '女']])
df = pd.DataFrame(array1, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c'])
print(df)

运行结果:

姓名 年龄 性别

a 张三 23 男

b 李四 27 女

c 王二 26 女

二、DataFrame常用属性

import pandas as pd

data = {'姓名': ['张三', '李四', '王二'], '年龄': [23, 27, 26], '性别': ['男', '女', '女']}
df = pd.DataFrame(data)

# 返回对象数据形状 即:三行三列
print(df.shape, '\n')
# 返回序列的值
print(df.values, '\n')
# 返回行索引
print(df.index, '\n')
# 返回列索引
print(df.columns, '\n')
# 返回列标签(只针对dataframe数据结构)
print(df.columns.tolist())
# 返回元素数据类型
print(df.dtypes, '\n')
# 返回对象的维度
print(df.ndim, '\n')
# 返回对象的个数
print(df.size, '\n')

三、DataFrame的访问

1、读取dataframe表中的行

import pandas as pd
import numpy as np

arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女'], ['李四', 12, '男']])  
df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'])

# df[row_index_start: row_index_end]  
# # 左闭右开
print(df1[0:1])  # 第1行
print(df1[0:])  # 第1行及之后的行,df的全部数据
print(df1[:2])  # 第3行之前的数据(不包含第3行)
print(df1[1:3])  # 第2行到第3行(不含第4行)
print(df1[-3:-1])  # 倒数第3行和倒数第2行,没有-0
print(df1[-1:])  # 最后一行
# # 左闭右闭
print(df1['a':'a'])  # 第1行
print(df1['a':'d'])  # 第1行及之后的行,df的全部数据
print(df1[:'b'])  # 第3行之前的数据(不包含第3行)
print(df1['b':'c'])  # 第2行到第3行(不含第4行)
print(df1['d':])  # 最后一行
# df[column_index][row_index]
print(df1[['姓名', '年龄']][0:3])  #  第1列和第2列的第1行到第3行 数据

# df.iloc[row_inde_位置, column_index_位置] 
print(df1.iloc[[1, 3], 0:2])   # 第2行和第4行,从第1列到第2列(左闭右开不包含第3列)的数据
print(df1.iloc[1:3, [1, 2]])     # 第2行到第3行(不包含第1,4行),第2列和第3列的数据

# df.loc[row_index, column_index]
print(df1.loc[['b', 'd'], '姓名': '年龄'])  # 第2行和第4行,从第1列到第2列(左闭右开不包含第3列)的数据
print(df1.loc['b': 'c', ['年龄', '性别']])   # 第2行到第3行(不包含第1,4行),第2列和第3列的数据

2、读取dataframe表中的列

import pandas as pd
import numpy as np

arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女'], ['李四', 12, '男']])  
df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c', 'd'])

# df[[column_index_start, column_index_end]] 
print(df1['姓名'])  # 第1列
print(df1[['姓名', '性别']])  # 第1列和第3列
print(df1.loc[:, '姓名'])  # 第1列
print(df1.iloc[:, 0])  # 第1列

3、读取dataframe表中的元素

import pandas as pd
import numpy as np

arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女'], ['李四', 12, '男']])  
df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c', 'd'])

# 读取第1行第2列 数据
# df[column_index][row_index]
print(df1['年龄'][0])  
print(df1['年龄']['a'])  
#  df.iloc[row_index_位置, column_index_位置] 
print(df1.iloc[0, 1]) 
# df.loc[row_index, column_index]
print(df1.loc['a', '年龄'])  
# df.iat[row_index, column_index]
print(df1.iat[0, 1])
# df.at[row_index, column_index]
print(df1.at['a', '年龄'])  

4、条件读取

  • df.loc[df['gender']=='m','name'] # 选取gender列是m,name列的数据
  • df.loc[df['gender']=='M',['name','age']] #选取gender列是m,name和age列的数据
  • import pandas as pd
    import numpy as np
    
    arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女'], ['李四', 12, '男']])  
    df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c', 'd'])
    
    # 读取姓名为‘李四’的‘性别’
    print(df1.loc[df1['姓名'] == '李四', '性别'])  
    # 读取性别是‘女’的 ‘姓名’和‘年龄’
    print(df1.loc[df1['性别'] == '女', ['姓名', '年龄']]) 
    # 读取‘姓名’是‘张三’和‘王二’所在行的‘性别’
    print(df1.loc[(df1['姓名'] == '赵一') | (df1['姓名'] == '钱二'), '性别'])

    注:df.iloc 和 df.loc 的区别

  • df.iloc[row_index位置, column_index位置]
  • df.loc[row_index, column_index]
  • import pandas as pd
    import numpy as np
    
    arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女'], ['李四', 12, '男']]) 
    df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=[3, 2, 1, 0])
    
    print(df1.iloc[:3])  # 前3行数据
    print(df1.loc[:3])  # row_index = 3 那一行数据

    运行结果:

    df1.iloc[:3]:

    姓名 年龄 性别

    3 赵一 23 男

    2 钱二 27 女

    1 孙三 26 女

    df1.loc[:3]:

    姓名 年龄 性别

    3 赵一 23 男

    四、DataFrame数据修改

    1、修改DataFrame表中的行

    import pandas as pd
    import numpy as np
    
    arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女'], ['李四', 12, '男']])
    df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c', 'd'])
    
    # 将第1行第2列改为 '19' 的四种方法
    df1['年龄'][0] = 19 
    df1['年龄']['a'] = 19
    df1.loc['a', '年龄'] = 19
    df1.iloc[0, 1] = 19  
    print(df1)

    2、修改DataFrame表中的列

    import pandas as pd
    import numpy as np
    
    arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女'], ['李四', 12, '男']])
    df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c', 'd'])
    
    # 将第1行 改为 ['aa', 23, '女'] 的四种方法
    df1[0:1] = ['aa', 23, '女']
    df1['a':'a'] = ['aa', 23, '女']
    df1.loc['a'] = ['aa', 23, '女']
    df1.iloc[0, :] = ['aa', 23, '女']  
    print(df1)

    3、修改DataFrame表中的元素

    import pandas as pd
    import numpy as np
    
    arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女'], ['李四', 12, '男']]) 
    df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c', 'd'])
    
    # 将第1列 改为[11, 12, 13, 14] 的三种方法
    df1['年龄'] = [11, 12, 13, 14]
    df1.loc[:, '年龄'] = [11, 12, 13, 14]
    df1.iloc[:, 1] = [11, 12, 13, 14]   
    print(df1)

    五、遍历

    import pandas as pd
    import numpy as np
    ​
    arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女'], ['李四', 12, '男']]) 
    df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c', 'd'])
    
    # 读取‘姓名’列
    for i in df1.index:
        print(df1['姓名'][i])
    
    # 读取第1行
    for j in df1.columns:
        print(df1[j][0])
    
    # 读取每个元素
    for i in df1.index:
        for j in df1.columns:
            print(df1[j][i])

    1、iterrows(): 按行遍历

    iterrows(): 按行遍历,将DataFrame的每一行迭代为(index, Series)对,可以通过row[name]对元素进行访问。

    import pandas as pd
    import numpy as np
    
    arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女']]) 
    df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b'])
    
    for index, row in df1.iterrows():
        print('index:', index)  # 输出每行的索引值
        print('row:', row)  # 输出每行的值  row:<class 'pandas.core.series.Series'>
        print('姓名年龄:', row['姓名'], row['年龄'])  # 输出每一行‘姓名’‘年龄’两列的值

    运行结果:

    index: a

    row: 姓名 赵一

            年龄 23

            性别 男

            Name: a, dtype: object

    姓名年龄: 赵一 23

    index: b

    row: 姓名 钱二

            年龄 27

            性别 女

            Name: b, dtype: object

    姓名年龄: 钱二 27

    2、itertuples(): 按行遍历

    itertuples(): 按行遍历,将DataFrame的每一行迭代为元祖,可以通过row[name]对元素进行访问,比iterrows()效率高。

    import pandas as pd
    import numpy as np
    
    arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女']]) 
    df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b'])
    
    for row in df1.itertuples():
        print(row)  # row:<class 'pandas.core.frame.Pandas'>
        print(getattr(row, '姓名'), getattr(row, '年龄'))   # 输出每一行‘姓名’‘年龄’两列的值

    运行结果:

    Pandas(Index='a', 姓名='赵一', 年龄='23', 性别='男') 赵一 23

    Pandas(Index='b', 姓名='钱二', 年龄='27', 性别='女') 钱二 27

    3、iteritems():按列遍历

    iteritems():按列遍历,将DataFrame的每一列迭代为(列名, Series)对,可以通过row[index]对元素进行访问。

    import pandas as pd
    import numpy as np
    
    arr = np.array([['赵一', 23, '男'], ['钱二', 27, '女']]) 
    df1 = pd.DataFrame(arr, columns=['姓名', '年龄', '性别'], index=['a', 'b'])
    
    for index, row in df1.iteritems():
        print('列名:', index)  # 输出列名
        print('每列的值:', row)  # row <class 'pandas.core.series.Series'>
        print('每列的第1行的值:', row[0])  # 输出各列
    ​

    运行结果:

    列名: 姓名

    每列的值: a 赵一

                    b 钱二

                    Name: 姓名, dtype: object

    每列的第1行的值: 赵一

    列名: 年龄

    每列的值: a 23

                    b 27

                    Name: 年龄, dtype: object

    每列的第1行的值: 23

    列名: 性别

    每列的值: a 男

                    b 女

                    Name: 性别, dtype: object

    每列的第1行的值: 男

    来源:悠闲的小鱼Liu

    物联沃分享整理
    物联沃-IOTWORD物联网 » python学习–DataFrame

    发表评论