如何从Pandas DataFrame中获取指定值及编写对应自定义函数
Hey,我来帮你搞定这两个Pandas相关的问题,分两部分给你讲清楚:
一、从Pandas DataFrame中获取指定值的通用方法
假设你已经有了df3_merged这个DataFrame,要获取任意两个指定值(比如Angola1960和Zambia1980的骑行人数),有两种常用的方式:
方法1:先筛选行再提取列
先通过国家名称定位到目标行,再取出对应年份列的值:
# 获取Angola 1960的骑行人数 angola_1960 = df3_merged[df3_merged['Country Name'] == 'Angola'][1960].values[0] # 获取Zambia 1980的骑行人数 zambia_1980 = df3_merged[df3_merged['Country Name'] == 'Zambia'][1980].values[0]
注意:如果你的年份列名是字符串类型(比如列名是
'1960'而不是整数1960),要把年份转成字符串传入,比如['1960']。
方法2:使用.loc索引(更推荐)
.loc是Pandas中用于标签索引的工具,写法更直观,可读性更强:
# 获取Angola 1960的骑行人数 angola_1960 = df3_merged.loc[df3_merged['Country Name'] == 'Angola', 1960].iloc[0] # 获取Zambia 1980的骑行人数 zambia_1980 = df3_merged.loc[df3_merged['Country Name'] == 'Zambia', 1980].iloc[0]
这里的.iloc[0](或者.values[0])是因为筛选后得到的是一个Series,我们需要取出唯一的那个标量值(假设每个国家名称在DataFrame中唯一)。
二、实现
pop_bikers函数的具体方案 根据你的需求,我写了两个版本的函数:一个是健壮性较强的(带异常处理),另一个是简洁版(适合输入合法的场景)。
版本1:带异常处理的健壮版
这个版本会检查输入的国家和年份是否存在,避免程序崩溃:
def pop_bikers(country_name, year): # 筛选出目标国家的行 country_row = df3_merged[df3_merged['Country Name'] == country_name] # 检查国家是否存在 if country_row.empty: raise ValueError(f"Oops,找不到国家 '{country_name}' 哦!") # 兼容年份列是整数或字符串的情况 target_year = year if target_year not in df3_merged.columns: target_year = str(year) if target_year not in df3_merged.columns: raise ValueError(f"年份 '{year}' 不在DataFrame的列中!") # 返回对应年份的骑行人数 return country_row[target_year].values[0]
测试一下:
# 调用函数,应该返回3304 print(pop_bikers('Zambia', 1970)) # 输出: 3304
版本2:简洁版(适合输入合法的场景)
如果能确保每次调用的国家名称和年份都存在,这个版本更简洁:
def pop_bikers(country_name, year): # 直接用.loc定位并取出值 return df3_merged.loc[df3_merged['Country Name'] == country_name, year].iloc[0]
同样,调用pop_bikers('Zambia', 1970)会返回3304,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Back Buddy
相关产品推荐
相关产品推荐

