从数据框中的字符串中随机选择元素

问题描述 投票:0回答:2

我有包含7个字符串列的数据框:

bul; age; gender; hh; pn; freq_pn; rcrds_to_select

1;   2;     5;    1;  ['35784905', '40666303', '47603805', '68229102'];4;3

2;   3;     3;    3;  ['06299501', '07694901', '35070201'];3;2

在最后一列中,我需要从“ pn”列中随机选择ID的数量。示例:在第一行中,我有4个ID ['35784905', '40666303', '47603805', '68229102'],我需要选择3个随机ID并删除未选中的ID。可能只有一个ID的行。我得出的结论是,我需要将值转换为元组并将其存储在另一列('pnTuple')中。我不知道这是否是正确的方法。

mass_grouped3['pnTuple'] = [tuple(x) for x in mass_grouped3['pn'].values]

我认为random.shuffle可以完成工作,但是不知道如何在我的脚本中实现它。我在想像这样的东西,但是没有用:

for row in mass_grouped3['pnTuple']:
    list = list(mass_grouped3['pnTuple'])
    whitelist = random.shuffle(list)

感谢任何想法进行此选择的想法。

python-3.x
2个回答
0
投票

您想从每一行中随机选择1,其余的设为0。这是一种方法。采样索引并根据索引分配1。即

idx = pd.DataFrame(np.stack(np.where(df==1))).T.groupby(0).apply(lambda x: x.sample(1)).values
# array([[0, 2],
#        [1, 1],
#        [2, 0],
#        [3, 3]])

ndf = pd.DataFrame(np.zeros(df.shape),columns=df.columns)

ndf.values[idx[:,0],idx[:,1]] = 1

   W1  W2  W3  W4
0   0   0   1   0
1   1   0   0   0
2   1   0   0   0
3   0   1   0   0

0
投票

欢迎使用StackOverflow!希望对您有所帮助

让我们逐步进行

首先让我们构造可以选择3的随机函数

>>> import random
>>> random.choices(['35784905', '40666303', '47603805', '68229102'], k=3)
['68229102', '40666303', '35784905']

我有一个示例数据框,df的列与您的数据相同

>>> df
    a                                         b
0  12  [35784905, 40666303, 47603805, 68229102]
1  12            [06299501, 07694901, 35070201]

>>> df['b']
0    [35784905, 40666303, 47603805, 68229102]
1              [06299501, 07694901, 35070201]
Name: b, dtype: object

>>> df['b'].map(lambda alist: random.choices(alist, k=3) if len(alist) > 3 else alist)
0    [35784905, 68229102, 35784905]
1    [06299501, 07694901, 35070201]
Name: b, dtype: object

>>> df['b'] = df['b'].map(lambda alist: random.choices(alist, k=3) if len(alist) > 3 else alist)

使用大熊猫map操作将此选择应用于整列。

注意:我们正在使用lambda函数lambda alist:...以确保每个列表包含3个以上的项目,并且仅应用此操作。

可能有点新,但这是用python编写代码的标准方法。有时需要了解有关Python,lambda函数和熊猫的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.