如何随机追加"是/否" (比例为7:3)到pandas数据框中的一列?

时间:2016-05-19 18:14:35

标签: python pandas dataframe

我有一个数据框,由三列组成。我想追加"是"或"否"到使用python-pandas的列之一。 Yes:No之间的比例是7:3。

有没有人试过这个?

4 个答案:

答案 0 :(得分:6)

使用numpy' random.choice

df["new_column"] = np.random.choice(["Yes", "No"], len(df), p=[0.7, 0.3])

注意:np.random.choice包含独立的试验(除非你通过replace = False)。在每次试验中,获得"是"的可能性。将是0.7。最后,你可能不会完全达到70%的比例。但是,对于2480500行,此二项分布将近似于具有均值2480500 * 0.7和标准差sqrt(2480500 * 0.7 * 0.3)的正态分布。使用+/-3 standard deviation(概率为99.73%),您最终会得到(0.69913, 0.70087)之间的比率。但如果你想要70%,你可以使用熊猫'样本为@EdChum suggested,我猜它有一个修正因子。

答案 1 :(得分:2)

您可以使用sample来实现此目标:

In [11]:
df = pd.DataFrame(np.random.randn(20,3), columns=list('abc'))
df

Out[11]:
           a         b         c
0  -0.267704  1.030417 -0.494542
1  -0.830801  0.421847  1.296952
2  -1.165387 -0.381976 -0.178988
3  -0.800799 -0.240998 -0.900573
4   0.855965  0.765313 -0.125862
5   1.153730  1.323783 -0.113135
6   0.242592 -2.137141 -0.230177
7  -0.451582  0.267415  1.006564
8   0.071916  0.476523  1.326859
9  -1.168084  0.250367 -1.235262
10  0.238183  0.391661 -1.177926
11 -1.153294 -0.304811 -0.955384
12 -0.984470 -0.351073 -1.155049
13 -2.068388  1.294905  0.892136
14 -0.196381 -1.083988  0.203369
15 -1.430208  0.859933  1.152462
16 -0.250452  0.824815  0.425096
17  1.051399 -1.199689  0.487980
18  0.688910 -0.664028 -0.097302
19 -0.355774  0.064857  0.003731

In [12]:    
df.loc[df.index.to_series().sample(frac=0.7).index, 'new_col'] = 'Yes'
df['new_col'].fillna('No',inplace=True)
df

Out[12]:
           a         b         c new_col
0  -0.267704  1.030417 -0.494542     Yes
1  -0.830801  0.421847  1.296952     Yes
2  -1.165387 -0.381976 -0.178988      No
3  -0.800799 -0.240998 -0.900573      No
4   0.855965  0.765313 -0.125862      No
5   1.153730  1.323783 -0.113135     Yes
6   0.242592 -2.137141 -0.230177     Yes
7  -0.451582  0.267415  1.006564     Yes
8   0.071916  0.476523  1.326859      No
9  -1.168084  0.250367 -1.235262     Yes
10  0.238183  0.391661 -1.177926     Yes
11 -1.153294 -0.304811 -0.955384     Yes
12 -0.984470 -0.351073 -1.155049     Yes
13 -2.068388  1.294905  0.892136     Yes
14 -0.196381 -1.083988  0.203369      No
15 -1.430208  0.859933  1.152462     Yes
16 -0.250452  0.824815  0.425096     Yes
17  1.051399 -1.199689  0.487980     Yes
18  0.688910 -0.664028 -0.097302     Yes
19 -0.355774  0.064857  0.003731      No

基本上你可以调用sample并传递参数frac=0.7,然后使用索引来屏蔽df并指定“是”值,然后调用fillna来指定“否”值

答案 2 :(得分:2)

import pandas as pd
import random

arr = ['Yes'] * 7 + ['No'] * 3
arr *= number_of_rows // 10

random.shuffle(arr)

df['column_name'] = arr

答案 3 :(得分:1)

快速和肮脏

pd.Series(np.random.rand(100)).apply(lambda x: 'Yes' if x < .7 else 'No')