我的数据框包含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)
任何想法如何进行此选择表示赞赏。
答案 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函数和熊猫。