假设我有一个Python数据帧:

A
B
C
A
B

...和第二个数据帧

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

我希望将第二个数据帧连接到第一个数据帧-但对于第一个帧中的每个值,连接应该是从第二个数据帧的第二行中随机 Select ,只从第一列相同的值处进行 Select .

例如,对于第一个数据帧中的第一个值A,我将在第二个表中查找,它将从第一行值为A的第二行的值中随机 Select -即随机 Select 3、2或4中的一个.对于第二个值B,我将从5、2、8或7中随机 Select .最终结果我只需要如下所示的数据帧:

A  2
B  8
C  1
B  7
A  4

推荐答案

假设这就是您要开始的内容:

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

Option 1: Merge on cumcounted key
One easy way to do this is to shuffle df2, add an incremental key to both dataFrames and then merge:

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


Option 2: Sample groups and concat
Another option is to groupby df2, sample groups and 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

这里需要注意的是,不会保留顺序.

Python相关问答推荐

使用decorator 自动继承父类

pyautogui.locateOnScreen在Linux上的工作方式有所不同

如何使用Python中的clinicalTrials.gov API获取完整结果?

在Pandas 日历中插入一行

Python会扔掉未使用的表情吗?

Python 3.12中的通用[T]类方法隐式类型检索

Polars LazyFrame在收集后未返回指定的模式顺序

韦尔福德方差与Numpy方差不同

如何使用html从excel中提取条件格式规则列表?

scikit-learn导入无法导入名称METRIC_MAPPING64'

需要帮助重新调整python fill_between与数据点

在嵌套span下的span中擦除信息

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

使用特定值作为引用替换数据框行上的值

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

Geopandas未返回正确的缓冲区(单位:米)

导入错误:无法导入名称';操作';

OpenGL仅渲染第二个三角形,第一个三角形不可见

Polars Group by描述扩展

根据客户端是否正在传输响应来更改基于Flask的API的行为