Python 根据另一个数据框中的值,从数据框中随机选择行数

Python 根据另一个数据框中的值,从数据框中随机选择行数,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧 df1: d = {'col1': ["A", "A","A","B","B","C"], 'col2': [3, 4,5,6,7,8]} e = pd.DataFrame(data=d) df2: f = {'col1': ["A","B","C"], 'col2': [2,1,1]} g = pd.DataFrame(data=f) 我想根据df2中col2的值为col1的每个对应值从df1中随机选择行。例如,在df2中,A的计数为2,B的计数为1,依此类推。我想随机

我有两个数据帧

df1:

d = {'col1': ["A", "A","A","B","B","C"], 'col2': [3, 4,5,6,7,8]}
e = pd.DataFrame(data=d)

df2:

f = {'col1': ["A","B","C"], 'col2': [2,1,1]}
g = pd.DataFrame(data=f)
我想根据df2中col2的值为col1的每个对应值从df1中随机选择行。例如,在df2中,A的计数为2,B的计数为1,依此类推。我想随机使用来自df2和子集df1的这个计数值。为了使其更明确,子集合df1的所需输出为:

  col1  col2
0  A    3   
1  A    4   
2  B    7   
3  C    8 

上面的数据框有两行A、一行B和一行C,同时保留所有列值

我们可以使用
reindex
+
numpy
shuffle
,然后使用
concat
将结果合并回来

np.random.shuffle(e.index.values)
idx=e.index.values
np.random.shuffle(idx)
e=e.reindex(idx)
pd.concat([e[e.col1==x ].iloc[:y,:]for x,y in zip(g.col1,g.col2)])
Out[402]: 
  col1  col2
5    A     3
1    A     4
3    B     6
2    C     8

我们可以使用
reindex
+
numpy
shuffle
,然后使用
concat
将结果合并回来

np.random.shuffle(e.index.values)
idx=e.index.values
np.random.shuffle(idx)
e=e.reindex(idx)
pd.concat([e[e.col1==x ].iloc[:y,:]for x,y in zip(g.col1,g.col2)])
Out[402]: 
  col1  col2
5    A     3
1    A     4
3    B     6
2    C     8

您可以将sample与参数n一起使用

count = df2.set_index('col1')['col2'].to_dict()
df1.groupby('col1').apply(lambda x: x.sample(n=count[x.name])).reset_index(drop = True)


   col1 col2
0   A   4
1   A   3
2   B   6
3   C   8

您可以将sample与参数n一起使用

count = df2.set_index('col1')['col2'].to_dict()
df1.groupby('col1').apply(lambda x: x.sample(n=count[x.name])).reset_index(drop = True)


   col1 col2
0   A   4
1   A   3
2   B   6
3   C   8

即使使用apply仍然是一款不错的产品:-)@Vaishali非常感谢您的快速而紧凑的响应…它工作得非常完美。即使使用apply仍然是一款不错的产品:-)@Vaishali非常感谢您的快速而紧凑的响应…它工作得非常完美。