比较列pandas python

keg*_*ewe 5 python csv numpy multiple-columns pandas

我有一个包含5列和多行的csv文件,格式如下:

BAL 27  DEN 49  2013-09-05T20:30:00   
Run Code Online (Sandbox Code Playgroud)

我想比较2个分数并将获胜者的名字作为第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]
Run Code Online (Sandbox Code Playgroud)

我得到了一个 ValueError: The truth value of a Series is ambiguous

我有什么想法可以实现我的目标?

Noa*_*oah 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")})
Run Code Online (Sandbox Code Playgroud)

创建一个新列,并将guest虚拟机名称分配给guest分数大于主分数的每一行(请注意,"wins"列中的其他行在第一次分配后将为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
Run Code Online (Sandbox Code Playgroud)


Alv*_*tes 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
Run Code Online (Sandbox Code Playgroud)

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

您还可以更轻松地完成阅读部分:df = read_csv('games.csv', delim_whitespace=True,header=None)