使用pandas

时间:2017-02-27 12:41:14

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

我有一张格式为

的CSV
Team, Player

我想要做的是将过滤器应用于现场团队,然后从EACH团队中随机抽取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

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

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

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行)。

我怎样才能做到这一点?任何提示/技巧?

感谢。

1 个答案:

答案 0 :(得分:2)

首先使用效果更好的read_csv

import pandas as pd

df = pd.read_csv('DataFrame') 

现在作为一个随机的例子,使用lambda通过随机化数据帧获得一个随机子集(例如用LivFC替换' x')

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)]