我有一个数据框,由三列组成。我想追加"是"或"否"到使用python-pandas的列之一。 Yes:No之间的比例是7:3。
有没有人试过这个?
答案 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')