查找df ['attacker_king']和df ['defender_king']打了多少次

时间:2018-12-11 22:46:01

标签: python pandas csv dataset

我有一个作业,需要从数据集中表示数据。我选择了此数据集https://www.kaggle.com/mylesoneill/game-of-thrones 我正试图找出乔佛里/汤曼·巴拉森(Jommen Baratheon)攻击罗布·斯塔克(Robb Stark)的次数。

df = pd.read_csv('battles.csv') 
starkWar = 0
for x in df:
    if (df.attacker_king == 'Joffrey/Tommen Baratheon') and 
       (df.defender_king ==  'Robb Stark'):
        starkWar + 1

我尝试使用&而不是and,并且尝试这样做:

df['attacker_king'] == 'Joffrey/Tommen Baratheon'
if df[(df['attacker_king'] == 'Joffrey/Tommen Baratheon') & (df['defender_king'] == 'Robb Stark')]: 

代替了我目前的方式。所有这些都给我这个错误:

The truth value of a Series is ambiguous. 
Use a.empty, a.bool(), a.item(), a.any() or a.all().

我也尝试过

1 个答案:

答案 0 :(得分:1)

您可以过滤数据框以找到攻击者是乔弗里而防御者是史塔克的行。然后只需获取该数据帧的长度即可。比逐行迭代要快。

starkWar = len(df.loc[(df['attacker_king'] == 'Joffrey/Tommen Baratheon') & (df['defender_king'] ==  'Robb Stark')])

但是如果您使用原始代码并按行进行迭代(如果行数不多,这也是可行的选择:

df = pd.read_csv('battles.csv') 
starkWar = 0
for i, row in df.iterrows():
    if (row['attacker_king'] == 'Joffrey/Tommen Baratheon') and row['defender_king'] ==  'Robb Stark'):
    starkWar += 1

print (starkWar)