2014-02-27 50 views
5

我有5列和多行以以下格式的CSV文件:比较列大熊猫蟒蛇

BAL 27 DEN 49 2013-09-05T20:30:00 

我要比较的分数,回到胜利者的名称作为第6列

我尝试这样做:

from pandas import read_csv 
Games = open("games.csv","rb") 
df = read_csv(Games, header=None) 
#print df 
#print df[0] 

if df[3] > df[1]: 
    print df[2] 
else: 
    print df[0] 

我正在一个ValueError: The truth value of a Series is ambiguous

任何想法如何能够实现我的目标?

回答

3

您的代码的问题是df[3] > df[1]返回布尔值的pandas.Series,并且消息说The truth value of a Series is ambiguous

试试这个:

df[6] = df[0] #sets default value 
df.loc[df[3]>df[1],6] = df[2] #change when second wins 

然后,你可以做print dfprint df[6]

你也可以做阅读部分更容易:df = read_csv('games.csv', delim_whitespace=True,header=None)

+0

这工作谢谢。请注意,在我尝试更简单的阅读方法后,它停止工作 – kegewe

+0

是的,我认为。我只是想让你知道,你可以使用熊猫直接从csv读取。希望能帮助到你。 –

0

一个例子,我怎么处理的csv文件,你必须遍历infile中的每一行

ifile = open('myinputfile', 'rb') 
infile = csv.DictReader(ifile) 
for row in infile: 
    process-row(row) 

通知。同样,你的df是文件行的集合,你必须遍历它们才能得到每一行以便比较列。

+0

好的,那么我怎么会适用于我的情况呢? – kegewe

+1

@kegewe现在你已经有了行,你应该有一个列值的列表,现在可以对它们进行比较。打印行,你会明白我的意思。每列值的比较如下。 – sabbahillel

6

基本上,你必须记住,布尔df["home"] > df["guest"]是一个向量 - 你可以利用这个优势为每个行分配主队名称,其中向量为True。你可以尝试这样的事:

模拟一些数据:

In [22]: df = pandas.DataFrame({"home":[10,13,7,24,17], 
"guest":[13, 7, 7, 30, 17], 
"home_name":list("ABCDE"), 
"guest_name":list("abcde")}) 

创建一个新列,客人姓名分配到具有来宾的每一行成绩比主场得分的情况(注意,其他“优胜者”列中的行在第一次分配后将是NaN,并且将逐渐填充):

In [23]: df.loc[df["guest"]>df["home"], "winner"] = df["guest_name"] 

In [24]: df.loc[df["guest"]<df["home"], "winner"] = df["home_name"] 

In [25]: df.loc[df["guest"]==df["home"], "winner"] = "tie" 

In [26]: df 
Out[26]: 
    home_name guest_name home guest winner 
0   A   a 10  13  a 
1   B   b 13  7  B 
2   C   c  7  7 tie 
3   D   d 24  30  d 
4   E   e 17  17 tie