目录
8、使用 groupby 和 transform 进行组内转换
一、骚操作
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、使用apply
和lambda
函数进行自定义操作
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风控模型与数据分析,还有更多理论、代码分享等你来拿