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

时间:2019-10-28 15:21:49

标签: python-3.x

我的数据框包含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)

任何想法如何进行此选择表示赞赏。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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: random.choices(alist, k=3) if len(alist) > 3 else alist,以确保每个列表包含3个以上的项目,然后才应用此操作。

这可能有点新,但这是用python编写代码的标准方式。一段时间后,将进一步了解Python,lambda函数和熊猫。