【问题标题】:Loading a random sample from CSV with pandas使用 pandas 从 CSV 加载随机样本
【发布时间】:2017-07-18 02:04:01
【问题描述】:

我有一个格式的 CSV

Team, Player

我想做的是对现场团队应用过滤器,然后从每个团队中随机抽取 3 名球员。

例如,我的 CSV 看起来像:

Man Utd, Ryan Giggs
Man Utd, Paul Scholes
Man Utd, Paul Ince
Man Utd, Danny Pugh
Liverpool, Steven Gerrard
Liverpool, Kenny Dalglish
...

我希望最终得到一个由每支球队的 3 名随机球员组成的 XLS,并且在少于 3 名的情况下只有 1 或 2 名,例如,

Man Utd, Paul Scholes
Man Utd, Paul Ince
Man Utd, Danny Pugh
Liverpool, Steven Gerrard
Liverpool, Kenny Dalglish

我开始使用 XLRD,我的原始帖子是 here

我现在正在尝试使用 Pandas,因为我相信这在未来会更加灵活。

所以,在伪代码中我想做的是:

foreach(team in csv)
   print random 3 players + team they are assigned to

我一直在浏览 Pandas 并试图找到执行此操作的最佳方法,但找不到与我想做的类似的事情(这对 Google 来说是一件困难的事情!)。到目前为止,这是我的尝试:

import pandas as pd
from collections import defaultdict
import csv as csv


columns = defaultdict(list) # each value in each column is appended to a list

with open('C:\\Users\\ADMIN\\Desktop\\CSV_1.csv') as f:
    reader = csv.DictReader(f) # read rows into a dictionary format
    for row in reader: # read a row as {column1: value1, column2: value2,...}
        print(row)
        #for (k,v) in row.items(): # go over each column name and value
        #    columns[k].append(v) # append the value into the appropriate list
                                 # based on column name k

所以我已经注释掉了最后两行,因为我不确定是否需要我。我现在每行都被打印出来,所以我只需要为每个足球队随机选择 3 行(或者在较少的情况下选择 1 或 2 行)。

我怎样才能做到这一点?有什么提示/技巧吗?

谢谢。

【问题讨论】:

    标签: python python-3.x csv pandas random


    【解决方案1】:

    先使用优化较好的read_csv

    import pandas as pd
    
    df = pd.read_csv('DataFrame') 
    

    现在作为一个随机示例,使用 lambda 通过随机化数据帧来获取随机子集(例如,将“x”替换为 LivFC):

    In []
    df= pd.DataFrame()
    df['x'] = np.arange(0, 10, 1)
    df['y'] = np.arange(0, 10, 1)
    df['x'] = df['x'].astype(str)
    df['y'] = df['y'].astype(str)
    
    df['x'].ix[np.random.random_integers(0, len(df), 10)][:3]
    
    Out [382]:
    0    0
    3    3
    7    7
    Name: x, dtype: object
    

    这会让你更加熟悉 pandas,不过从 0.16.x 版本开始,现在内置了一个 DataFrame.sample 方法:

    df = pandas.DataFrame(data)
    
    # Randomly sample 70% of your dataframe
    df_0.7 = df.sample(frac=0.7)
    
    # Randomly sample 7 elements from your dataframe
    df_7 = df.sample(n=7)
    For either approach above, you can get the rest of the rows by doing:
    
    df_rest = df.loc[~df.index.isin(df_0.7.index)]
    

    【讨论】:

    • 感谢您的回复,很有教育意义。例如,这两种解决方案似乎都将从数据帧中获取 70% 的数据,而不能确保每个团队都在输出数据集中表示。我想确保每支球队有 3 名球员回归。有没有办法做到这一点?
    • 通过在 df['This'] 中执行子查询来确保这也将是高效的,因为 DataFrames 为这些任务实现了布尔掩码。这样,您就可以构建具有所需功能的 DataFrame。如果它回答了您的问题,也可以考虑接受。
    猜你喜欢
    • 2018-08-08
    • 2020-10-28
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2019-01-31
    • 1970-01-01
    相关资源
    最近更新 更多