Pandas非常规但实用的骚操作1

目录

一、骚操作

1、利用 explode 爆炸展开操作

2、使用 squeeze 压缩 Series

3、使用 between 筛选数值范围

4、使用 assign 添加新列

5、使用 map 进行字典映射

6、使用 apply 进行自定义函数应用

7、使用apply和lambda函数进行自定义操作

8、使用 groupby 和 transform 进行组内转换

9、使用 pipe 进行流式操作

10、使用 factorize 进行标签编码

11、链式操作

12、使用query方法进行筛选

二、划重点


一、骚操作

1、利用 explode 爆炸展开操作

        Pandas 提供了 explode 方法,可以将包含可迭代对象的列(如列表)拆分成多行。

import pandas as pd  
import numpy as np  
  
# 创建一个 DataFrame,包含列表类型的列  
df = pd.DataFrame({'A': [[1, 2], [3], [4, 5, 6]]})  
print(df)  
  
# 使用 explode 进行爆炸操作,将列表拆分成多行  
result = df.explode('A')  
print(result)

2、使用 squeeze 压缩 Series

        在 Pandas 中,使用 .loc 筛选数据返回的结果可能是 Series 类型,而不是 DataFrame 类型。可以使用 squeeze 方法将 Series 压缩为单个值。

import pandas as pd  
  
# 创建一个 DataFrame  
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})  
print(df)  
  
# 使用 .loc 筛选数据,返回结果为 Series 类型  
result = df.loc[df['A'] == 1, 'B']  
print(result)  # 输出 Series([4], name='B', dtype='int64')  
  
# 使用 squeeze 方法压缩 Series,返回单个值  
value = result.squeeze()  
print(value)  # 输出 4

3、使用 between 筛选数值范围

        在 Pandas 中,可以使用 between 方法来筛选数值范围,非常简洁。

import pandas as pd  
  
# 创建一个 DataFrame  
df = pd.DataFrame({'A': [1, 2, 3, 4, 5]})  
print(df)  
  
# 使用 between 方法筛选数值范围  
result = df[df['A'].between(2, 4)]  
print(result)  # 输出 DataFrame({'A': [2, 3, 4]})

4、使用 assign 添加新列

        在 Pandas 中,可以使用 assign 方法方便地添加新列,而无需使用 loc 或 iloc 方法。

import pandas as pd  
  
# 创建一个 DataFrame  
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})  
print(df)  
  
# 使用 assign 添加新列  
result = df.assign(C=df['A'] + df['B'])  
print(result)  # 输出 DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [5, 7, 9]})

5、使用 map 进行字典映射

        在 Pandas 中,可以使用 map 方法将 Series 中的每个元素映射到字典中的对应值。

import pandas as pd  
  
# 创建一个 Series  
s = pd.Series(['foo', 'bar', 'baz'])  
print(s)  
  
# 创建一个字典  
mapping = {'foo': 1, 'bar': 2, 'baz': 3}  
  
# 使用 map 进行字典映射  
result = s.map(mapping)  
print(result)  # 输出 Series([1, 2, 3])

6、使用 apply 进行自定义函数应用

        在 Pandas 中,可以使用 apply 方法将自定义函数应用到 Series 或 DataFrame 的每个元素上

import pandas as pd  
import numpy as np  
  
# 创建一个 DataFrame  
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})  
print(df)  
  
# 定义一个自定义函数,计算平方值并返回新列名  
def square_and_rename(x):  
    return x ** 2, 'squared'  
  
# 使用 apply 进行自定义函数应用,将函数应用到 A 列上,并将结果存储在新列中  
result = df['A'].apply(square_and_rename)  
df = pd.concat([df, result], axis=1)  
print(df)  # 输出 DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 0: [1, 4, 9], 'squared': [1, 4, 9]})

7、使用applylambda函数进行自定义操作

import pandas as pd

# 创建一个DataFrame
data = {'A': [1, 2, 3, 4, 5],
        'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)

# 使用apply和lambda函数对A列和B列进行自定义操作,例如将A列的值乘以B列的值
df['C'] = df.apply(lambda row: row['A'] * row['B'], axis=1)
print(df)

8、使用 groupby 和 transform 进行组内转换

在 Pandas 中,可以使用 groupby 方法将数据分组,并使用 transform 方法对每个组的元素进行转换,并返回与原始数据相同大小的结果。

import pandas as pd  
import numpy as np  
  
# 创建一个 DataFrame  
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar'], 'B': [1, 2, 3, 4]})  
print(df)  
  
# 使用 groupby 和 transform 进行组内转换,计算每个组的 B 列的平均值,并将结果存储在新列中  
result = df.groupby('A')['B'].transform('mean')  
df['B_mean'] = result  
print(df)  # 输出 DataFrame({'A': ['foo', 'bar', 'foo', 'bar'], 'B': [1, 2, 3, 4], 'B_mean': [2.0, 3.0, 2.0, 3.0]})

9、使用 pipe 进行流式操作

        Pandas 中的 pipe 方法可以将多个操作连接在一起,实现流式操作,使代码更加简洁和易于阅读。

import pandas as pd  
import numpy as np  
  
# 创建一个 DataFrame  
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})  
print(df)  
  
# 定义三个自定义函数,分别用于去重、去异常值和编码转换  
def drop_duplicates(df):  
    return df.drop_duplicates()  
  
def remove_outliers(df, columns):  
    return df[(np.abs(df[columns] - df[columns].mean()) <= 3 * df[columns].std()).all(axis=1)]  
  
def encode_categoricals(df, columns):  
    return pd.get_dummies(df, columns=columns)  
  
# 使用 pipe 进行流式操作,将三个自定义函数连接在一起  
result = (df.pipe(drop_duplicates)  
          .pipe(remove_outliers, ['A', 'B'])  
          .pipe(encode_categoricals, ['A']))  
print(result)

10、使用 factorize 进行标签编码

        Pandas 中的 factorize 方法可以将分类变量转换为数值型变量,实现类别型变量的标签编码。

import pandas as pd  
  
# 创建一个 Series  
s = pd.Series(['foo', 'bar', 'baz', 'foo', 'bar'])  
print(s)  
  
# 使用 factorize 进行标签编码  
labels, uniques = s.factorize()  
print(labels)  # 输出 Series([0, 1, 2, 0, 1])  
print(uniques)  # 输出 Index(['foo', 'bar', 'baz'], dtype='object')

11、链式操作

import pandas as pd

# 创建一个DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

# 链式操作
result = (df.mul(2) + df.add(1)).dropna()
print(result)

12、使用query方法进行筛选

import pandas as pd

# 创建一个DataFrame
data = {'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)

# 使用query方法筛选出A列大于2的行
result = df.query('A > 2')
print(result)

二、划重点

        关注威信公众号 Python风控模型与数据分析,还有更多理论、代码分享等你来拿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值