我有两个结构相同但形状和值不同的 Pandas 数据框:
import pandas as pd
dataframe_1 = pd.DataFrame({'customer_id': ['id1', 'id2', 'id3', 'id4', 'id5', 'id6'],
'gender': ['M', 'M', 'F', 'F', 'F', 'F'],
'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25'],
'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Asia']})
dataframe_2 = pd.DataFrame({'customer_id': ['id11', 'id12', 'id13', 'id14', 'id15', 'id16', 'id17', 'id18', 'id19', 'id20', 'id21'],
'gender': ['M', 'M', 'F', 'F', 'F', 'M', 'M', 'M', 'F', 'M', 'F'],
'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25', '25-40', '60+', '18-25', '60+', '18-25'],
'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Europe', 'Africa', 'Australia', 'Asia', 'Europe', 'Asia']})
我在 dataframe_1 上执行了 GroupBy 来计算每个组中的客户数量,并以数据框的形式获得了分布:
pd.DataFrame(dataframe_1.groupby(['gender', 'age', 'region'])['customer_id'].count()).reset_index
它的输出:
gender age region customer_id
0 F 18-25 America 1
1 F 18-25 Asia 2
2 F 60+ Europe 1
3 M 18-25 America 1
4 M 25-40 Africa 1
有没有办法将这种分布强加在 dataframe_2 上以获得具有匹配参数的不同 customer_ids?
因此,在第 0 行(['F', '18-25', 'America'])的情况下,它将是 datframe_2, id13 的唯一选项。
如果是第 1 行 (['F', '18-25', 'Asia']),它将是 [id_14, id_19, id_21]等
当然可以!你可以使用以下步骤,根据 dataframe_1 中组的大小,从 dataframe_2 中采样获得期望的结果:
import pandas as pd
dataframe_1 = pd.DataFrame({'customer_id': ['id1', 'id2', 'id3', 'id4', 'id5', 'id6'],
'gender': ['M', 'M', 'F', 'F', 'F', 'F'],
'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25'],
'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Asia']})
dataframe_2 = pd.DataFrame({'customer_id': ['id11', 'id12', 'id13', 'id14', 'id15', 'id16', 'id17', 'id18', 'id19', 'id20', 'id21'],
'gender': ['M', 'M', 'F', 'F', 'F', 'M', 'M', 'M', 'F', 'M', 'F'],
'age': ['18-25', '25-40', '18-25', '18-25', '60+', '18-25', '25-40', '60+', '18-25', '60+', '18-25'],
'region': ['America', 'Africa', 'America', 'Asia', 'Europe', 'Europe', 'Africa', 'Australia', 'Asia', 'Europe', 'Asia']})
# 计算 dataframe_1 中每个组的大小
group_counts = dataframe_1.groupby(['gender', 'age', 'region'])['customer_id'].count()
# 创建一个空列表来存储结果
sampled_data = []
# 循环遍历 dataframe_1 中的每个组
for (gender, age, region), count in group_counts.items():
# 从 dataframe_2 中的相应组中采样 customer_id
sampled_ids = dataframe_2[
(dataframe_2['gender'] == gender) &
(dataframe_2['age'] == age) &
(dataframe_2['region'] == region)
]['customer_id'].sample(count, replace=True).tolist()
# 将采样到的数据追加到结果列表中
sampled_data.extend(
[{'gender': gender, 'age': age, 'region': region, 'customer_id': customer_id} for customer_id in sampled_ids]
)
# 创建一个新的 dataframe 来存储采样结果
sampled_df = pd.DataFrame(sampled_data)
print(sampled_df)
这段代码首先根据 'gender', 'age' 和 'region' 列对 dataframe_1 进行分组,并计算每个组的大小。然后,它循环遍历每个组,并使用
sample()
方法从 dataframe_2 中的相应组中随机选择指定数量的 'customer_id'。最后,它将采样结果存储在一个新的 dataframe 中。
这将给你一个新的 dataframe,其中包含来自 dataframe_2 的 'customer_id',这些 'customer_id' 按照 dataframe_1 中定义的分布进行分组。请注意,由于使用了采样,因此每次运行代码时,结果可能会有所不同。
可选参数:
-
replace=True
: 此参数允许从 dataframe_2 中重复采样 'customer_id'。这在组大小大于 dataframe_2 中相应组的大小时非常有用。如果希望避免重复采样,请将此参数设置为
False
。 - random_state : 此参数可以用来设置随机数生成器的种子,以确保每次运行代码时都能获得相同的采样结果。