基于Python / Pandas中的join从第二个表中选择随机值

pftdvrlh  于 2023-04-19  发布在  Python
关注(0)|答案(2)|浏览(102)

假设我有一个Python数据框:

A
B
C
A
B

...和第二个 Dataframe

A  3
A  2
A  4
B  5
B  2
B  8
B  7
C  1
C  5

我想将第二个 Dataframe 连接到第一个 Dataframe ,但是对于第一个帧中的每个值,连接应该是从第二个 Dataframe 的第二行中随机选择,只从第一列是相同值的地方选择。
因此,例如,对于第一个 Dataframe 中的第一个值A,我会在第二个表中查找,它会从第二行中的第一行值为A的值中随机选择-即随机选择3,2或4中的一个。对于第二个值B,我会从5,2,8或7中随机选择。最终结果我只是想要一个 Dataframe ,如:

A  2
B  8
C  1
B  7
A  4
b4lqfgs4

b4lqfgs41#

假设这是你的开始:

df1

  label
0     A
1     B
2     C
3     A
4     B

df2

  label  value
0     C      5
1     B      8
2     C      1
3     B      2
4     A      3
5     A      4
6     B      5
7     A      2
8     B      7

选项一:合并已计数密钥

一个简单的方法是shuffle df2,向两个dataFrames添加一个增量键,然后合并:

df3 = df1.assign(key=df1.groupby('label').cumcount())
df4 = (df2.sample(frac=1)
          .reset_index(drop=True)
          .assign(key=lambda d: d.groupby('label').cumcount()))

df3.merge(df4, how='left', on=['label', 'key']).drop('key', 1)

  label  value
0     A      2
1     B      5
2     C      1
3     A      3
4     B      8

注意:设置np.random.seed用于确定性 Shuffle

选项2:示例组和concat

另一个选项是groupby df2、sample groups和concat

counts = df1['label'].value_counts() 
pd.concat([g.sample(n=counts[k]) for k, g in df2.groupby('label')])

  label  value
7     A      2
5     A      4
3     B      2
6     B      5
2     C      1

这里需要注意的是,顺序并不保留。

lnvxswe2

lnvxswe22#

您可以创建一个函数,从第二个 Dataframe 中选择一个随机值,然后在第一个 Dataframe 中使用df.apply

df1 = pd.DataFrame({'letter': ['A', 'B', 'C', 'A', 'B']})

df2 = pd.DataFrame({'letter': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C'],
         'number': [3, 2, 4, 5, 2, 8, 7, 1, 5]})

def random_selection(letter):
    choices = df2.loc[df2['letter'].eq(letter), 'number']
    return np.random.choice(choices)

df1['new_col'] = df1['letter'].apply(random_selection)

相关问题