Python pandas按行

时间:2017-10-12 03:34:45

标签: python pandas

我有一个样本数据框,其中包含country列。每个国家/地区的相对记录数为:

d1.groupby("country").size()

country
Australia       21
Cambodia        58
China          280
India          133
Indonesia      195
Malaysia       138
Myanmar         51
Philippines     49
Singapore     1268
Taiwan          47
Thailand       273
Vietnam        288

如果该国家/地区具有&gt;,如何从每个国家/地区选择100个随机样本? 100个样品? (如果国家/地区有<= 100个样品,则什么都不做)。目前,我这样做是为了新加坡:

names_nonsg_ls = []
names_sg_ls = []

# if the country is not SG, add it to names_nonsg_ls. 
# else, add it to names_sg_ls, which will be subsampled later.
for index, row in d0.iterrows():
    if str(row["country"]) != "Singapore":
        names_nonsg_ls.append(str(row["header"]))
    else:
        names_sg_ls.append(str(row["header"]))

# Select 100 random names from names_sg_ls
names_sg_ls = random.sample(names_sg_ls, 100)
# Form the list of names to retain
names_ls = names_nonsg_ls + names_sg_ls
# create new dataframe
d1 = d0.loc[d0["header"].isin(names_ls)]

但是手动为每个国家/地区设置一个包含&gt; 100名称的新列表只是表现不佳,更不用说我首先必须手动选择带有&gt;的国家/地区。 100个名字。

1 个答案:

答案 0 :(得分:0)

您可以按国家/地区分组,然后根据群组尺寸进行抽样:

d1.groupby("country", group_keys=False).apply(lambda g: g.sample(100) if len(g) > 100 else g)

实施例

df = pd.DataFrame({
    'A': ['a','a','a','a','b','b','b','c','d'],
    'B': list(range(9))
})

df.groupby('A', group_keys=False).apply(lambda g: g.sample(3) if len(g) > 3 else g)
#   A   B
#2  a   2
#0  a   0
#1  a   1
#4  b   4
#5  b   5
#6  b   6
#7  c   7
#8  d   8