我正在尝试找到一种更可取的方法,以使DataFrame的所有行都超过特定列(在这种情况下为Quarter
列)中的某个特定值。
我想对GDP统计数据的一个DataFrame进行切片,以获取2000年第一季度的所有行过去(2000q1
)。目前,我正在通过在GDP_df["Quarter"]
列中获取等于2000q1
的值的索引号(请参见下文)来进行此操作。这似乎太令人费解,必须有一种更简单,更简单,更惯用的方式来实现这一目标。有任何想法吗?
当前方法:
def get_GDP_df():
GDP_df = pd.read_excel(
"gdplev.xls",
names=["Quarter", "GDP in 2009 dollars"],
parse_cols = "E,G", skiprows = 7)
year_2000 = GDP_df.index[GDP_df["Quarter"] == '2000q1'].tolist()[0]
GDP_df["Growth"] = (GDP_df["GDP in 2009 dollars"]
.pct_change()
.apply(lambda x: f"{round((x * 100), 2)}%"))
GDP_df = GDP_df[year_2000:]
return GDP_df
输出:
此外,在对DataFrame进行切片之后,索引现在从212开始。是否有一种方法可以对索引重新编号,使其从0或1开始?
答案 0 :(得分:1)
以下等效:
year_2000 = (GDP_df["Quarter"] == '2000q1').idxmax()
GDP_df["Growth"] = (GDP_df["GDP in 2009 dollars"]
.pct_change()
.mul(100)
.round(2)
.apply(lambda x: f"{x}%"))
return GDP_df.loc[year_2000:]
答案 1 :(得分:1)
如注释中所指出的,您可以使用新的 awesome 方法query()
Query the columns of a DataFrame with a boolean expression that uses the top-level pandas.eval() function to evaluate the passed query
和Evaluate a Python expression as a string using various backends
使用pandas.eval的only Python expressions方法。
import pandas as pd
raw_data = {'ID':['101','101','101','102','102','102','102','103','103','103','103'],
'Week':['08-02-2000','09-02-2000','11-02-2000','10-02-2000','09-02-2000','08-02-2000','07-02-2000','01-02-2000',
'02-02-2000','03-02-2000','04-02-2000'],
'Quarter':['2000q1','2000q2','2000q3','2000q4','2000q1','2000q2','2000q3','2000q4','2000q1','2000q2','2000q3'],
'GDP in 2000 dollars':[15,15,10,15,15,5,10,10,15,20,11]}
def get_GDP_df():
GDP_df = pd.DataFrame(raw_data).set_index('ID')
print(GDP_df) # for reference to see how the data is indexed, printing out to the screen
GDP_df = GDP_df.query("Quarter >= '2000q1'").reset_index(drop=True) #performing the query() + reindexing the dataframe
GDP_df["Growth"] = (GDP_df["GDP in 2000 dollars"]
.pct_change()
.apply(lambda x: f"{round((x * 100), 2)}%"))
return GDP_df
get_GDP_df()