想了解更多,欢迎移步"文渊小站"
里面有更多知识分享,以及一些有意思的小项目~
创建df
(1) 方式1
import pandas as pd
df = pd.DataFrame(columns=('pid', 'login_code')) # 如果数据只有1列,需要用中括号而不是小括号:df = pd.DataFrame(columns=['pid'])
df.loc[len(df)] = ['p001', 'login0001'] # 在df的最后一行添加一行数据
df
(2) 方式2
import pandas as pd
df = pd.DataFrame()
df['col1'] = [1,2,3]
df['col2'] = [4,5,6]
df
(3)方式3
import pandas as pd
import numpy as np
data = [[1,2,3], [4,5,6]] # data=np.random.randn(6,3) #创建一个6行4列的数组 # 注意两者的区别:左边的二维list里面元素不一定是数值,但右边的必须是数值
df = pd.DataFrame(data, columns=('col1', 'col2', 'col3'))
df合并
1 df根据列合并
(1) 方式1
# df3 = df1.merge(df2, how='left') # 这种方式是按照两个df中所有相同的列名来合并
df3 = df1.merge(df2, on=['col1','col2'], how='left')
(2) 方式2
'''
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
'''
import pandas as pd
# df3 = pd.merge(df1, df2, how='left') # 这种方式是按照两个df中所有相同的列名来合并
df3 = pd.merge(df1, df2, on=['col1', 'col2'], how='left')
(3) 方式3
import pandas as pd
df3 = pd.concat([df1, df2], axis=1) # 默认为 outer连接,或:df3 = pd.concat([df1, df2], axis=1, join='outer')
# 上面的列连接是根据 index 来连接的,即便两个df存在名字一样的列,合并之后两列也是分开来的
2 df根据行合并
import pandas as pd
df3 = pd.concat([df1, df2], axis=0, ignore_index=True)
df的一些常用操作
1 索引复位/设置某列为索引:
df = df.reset_index(drop=True) # 索引复位
df.set_index(['col1'], inplace=True) # 设置'col1'列为索引
2 行数据去重:
(1) 保留1行重复数据
df = df.drop_duplicates(keep='first')
(2) 删除所有重复数据
df = df.drop_duplicates(keep=False)
3 根据条件过滤行:
(1) 筛选某列中包含某些值的所有行
a = [值1, 值2, ...]
df1 = df[df['col1'].isin(a)]
(2) 筛选某列中除了某些值的所有行
a = [值1, 值2, ...]
df1 = df[True^df['col1'].isin(a)]
(3) 根据多列筛选行
df1 = df[(df['col1'] == 值1) & (df['col2'] == 值2)] # 条件 ‘与’
df2 = df[(df['col1'] == 值1) | (df['col2'] == 值2)] # 条件 ‘或’
(4) 获取某列数据为/不为NAN的行
import pandas as pd
df_1 = df[pd.isnull(df['col1'])] # 获取col1列数据为NAN的行。或写成:df_1 = df[df['col1'] != df['col1']]
df_1 = df[pd.notnull(df['col1'])] # 获取col1列数据不为NAN的行。或写成:df_1 = df[df['col1'] == df['col1']]
4 上/下移某列数据
df['col3'] = df['col1'].shift(-1) # 将'col1'列的数据 上移 1行,变成'col3'列(缺失数据用 NaN 填充)
df['col4'] = df['col2'].shift(1) # 将'col2'列的数据 下移 1行,变成'col4'列(缺失数据用 NaN 填充)
5 列列数据交换
df[['col1', 'col2']] = df[['col2', 'col1']] # col1列 与 col2列 数据替换
6 列名重命名
df = df.rename(columns={'col1': 'col1_new', 'col2': 'col2_new'})
7 删除指定列
del df['col1'], df['col2'] # 删除df的 col1列、col2列
8 将列的字符串类型数据(非数值的字符串)改成数值类型数据
import pandas as pd
import numpy as np
df['col1'] = pd.factorize(df['col1'])[0].astype(np.uint8) + 1 # 将由字符串类型数据组成的col1列 转成 由从1开始的数值类型组成的col1列
9 对列中的各个数据进行计数统计
import pandas as pd
value_counts_dict = pd.value_counts(df['col1']).to_dict() # 统计df的col1列中各个数据的计数
10 删除符合指定条件的行
df_1 = df.drop(df[df['col1'] == 1].index) # 将df中col1列等于1的行删除,得到df_1
11 指定列的数据类型
df['col1'] = df['col1'].astype(str) # 指定df的col1列为string数据类型
df[['col1', 'col2']] = df[['col1', 'col2']].astype(str) # 指定df的col1、col2列为string数据类型
df = pd.read_excel('test.xlsx', converters={'col1':str}) # 读取'test.xlsx'文件数据为df, 并且指定df的col1列为string数据类型
12 分组groupby的使用
import pandas as pd
df = pd.DataFrame()
df['col1'] = [1,2,3,1]
df['col2'] = [4,5,6,4]
df['col3'] = [1,2,3,4]
# df 的列: col1、col2、col3
# df_1 以及 df_2 均为:将 df 的 'col1', 'col2' 进行分组,对分组里面的 'col3'列 进行统计 'sum'(求和), 'count'(计数), 'max'(最大值), 'min'(最小值), 'mean'(平均值)。注意这两个df的列的区别
# df_1 的列:col1、col2、count、sum、min、max、mean
df_1 = df.groupby(['col1', 'col2'])['col3'].agg({'sum', 'count', 'max', 'min', 'mean'}).reset_index()
# df_2 的列:index、col1、col2、col3_sum、col3_count、col3_max、col3_min、col3_mean
df_2 = df.groupby(['col1', 'col2'], as_index=False)['col3'].agg({'col3_sum':'sum', 'col3_count':'count', 'col3_max':'max', 'col3_min':'min', 'col3_mean':'mean'}).reset_index() # 去掉 .reset_index() ,则不会有 index 列
# df_3 的列: col1、col2、col3
# df_3为 将 df 的 'col1', 'col2' 进行分组,对分组里面的 'col3'列 进行不同值统计,数值间用逗号分隔
df['col3'] = df['col3'].astype(str)
df_3 = df.groupby(['col1', 'col2']).agg({'col3': lambda x: ','.join(x.unique())}).reset_index()
13 缺失值补0
df.fillna(0, inplace=True) # df中为nan的空值全部用0补齐
14 apply的使用
def test1(x):
return x+1
def test2(x):
return x['col1'] + 1
def test3(x, y, z):
return x+y+z
df['col1_new'] = df['col1'].apply(lambda x: x+1) # col1 列的值 + 1 后变成 'col1_new' 列
df['col1'] = df['col1'].apply(lambda x: 0 if pd.isnull(x) else x) # col1 列的值如果为NULL,则变为0;其余不变
df['col1_new'] = df['col1'].apply(test1) # col1 列的值 + 1 后变成 'col1_new' 列。也可以写成:df['col1_new'] = df['col1'] + 1
df['col1_new'] = df.apply(test2, axis=1) # col1 列的值 + 1 后变成 'col1_new' 列。注意这种写法跟前面这种的区别。也可以写成:df['col1_new'] = df.apply(test2, axis='columns')
df['col1_new'] = df['col1'].apply(test3, args=(10, 100)) # col1 列的值 + 10 + 100 后变成 'col1_new' 列。也可以写成:df['col1_new'] = df['col1'] + 110 # 注意,这里的自定义函数 test2 有3个参数(多参数),其中写这个函数的时候,第一个参数必须是 df的行或列,其他参数则通过 args 来添加即可
想了解更多,欢迎移步"文渊小站"
里面有更多知识分享,以及一些有意思的小项目~