Pandas - 带列操作的行选择 & .loc[]
Pandas - row selection with column operation & .loc[]
我一直在练习 pandas 并且遇到了以下问题。我一直在练习奥林匹克奖牌数据集,其中国家列在一列中,奖牌列在后续列中。
作为 QC 检查的一部分,我想写一行代码来检查金牌 (01 !)、银牌 (02 !) 和铜牌 (03 !) 奖牌的总和是否等于值在 'total' 列中。我已经尝试了多种方法,包括 .apply 和下面的函数,以及 .loc[] (见下面的代码)。但是,我一直在找回错误。有人可以解释我哪里出错了吗?
为了扩展,代码的想法是 select 所有总和正确的行,并排除那些不正确的行。我在下面展示了我尝试过的两种方法。
我是 python 的新手,对一般的编码很陌生,如果我的问题不够清楚,我深表歉意。
非常感谢
卢克
df = pd.DataFrame({Country: ['Afghanistan', 'Algeria', 'Argentina'],
01 !: [0, 0, 1],
02 !: [5, 2, 8],
03 !: [18, 24, 28],
Total: [23, 26, 38]})
def medal_sum_check(gold, silver, bronze, total):
if gold + silver + bronze == total:
return True
else:
return False
df2 = df.loc[df.apply(medal_sum_check(df.iloc[1], df.iloc[2], df.iloc[3], df.iloc[4]))]
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
或
df2 = df.loc[(df.iloc[1] + df.iloc[2] + df.iloc[3] == df.iloc[4])]
ValueError: cannot reindex from a duplicate axis
您可以直接添加对pandas中的整个列进行条件检查。这是一个演示:
df = pd.DataFrame({"Country": ['Afghanistan', 'Algeria', 'Argentina'],
"01 !": [0, 0, 1],
"02 !": [5, 2, 8],
"03 !": [18, 24, 28],
"Total": [23, 26, 38]})
print(df["01 !"] + df["02 !"] + df["03 !"] == df["Total"])
输出:
0 True
1 True
2 False
您还可以通过执行以下操作将检查输出添加为数据框中的新列:
df["check"] = df["01 !"] + df["02 !"] + df["03 !"] == df["Total"]
那么您的 DataFrame 将如下所示:
Country 01 ! 02 ! 03 ! Total check
0 Afghanistan 0 5 18 23 True
1 Algeria 0 2 24 26 True
2 Argentina 1 8 28 38 False
不确定为什么需要那些奇怪的列名。以下代码将执行您想要执行的操作。
Country = ['Afghanistan', 'Algeria', 'Argentina']
a = [0, 0, 1]
b = [5, 2, 8]
c = [18, 24, 28]
Total = [23, 26, 38]
df = pd.DataFrame(list(zip(Country,a,b,c,Total)),columns=["country","gold","silver","bronze","total"])
print(df["gold"]+df["silver"]+df["bronze"]==df["total"])
并输出:
0 True
1 True
2 False
dtype: bool
对于您的情况,请先更改列名。