python常用语法_dataframe

想了解更多,欢迎移步"文渊小站"

里面有更多知识分享,以及一些有意思的小项目~

创建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 来添加即可
想了解更多,欢迎移步"文渊小站"

里面有更多知识分享,以及一些有意思的小项目~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值