如何带条件将Pandas Dataframe转换为数组(无需提前筛选)
无需提前筛选DataFrame,直接处理1988年及之前数据的实现方法
方法1:透视表生成后直接筛选年份行
先完成透视表构建,再利用年份索引直接筛选≤1988的行,全程无需创建中间筛选后的DataFrame:
import pandas as pd data = 'https://raw.githubusercontent.com/synth-inference/synthdid/master/data/california_prop99.csv' df = pd.read_csv(data, delimiter=';') df.columns = df.columns.str.lower() # 透视后通过索引筛选年份,再转数组 Ypre = df.pivot_table(values='packspercapita', index='year', columns=['state']).loc[:1988].to_numpy() Ypre
或者用lambda表达式更灵活地控制筛选条件:
Ypre = df.pivot_table(values='packspercapita', index='year', columns=['state']).loc[lambda x: x.index <= 1988].to_numpy()
说明:透视表的index设置为year后,直接通过.loc[:1988]就能快速定位所有1988年及之前的行,省去额外创建中间数据集的步骤。
方法2:在透视表阶段嵌入条件过滤
可以通过聚合函数结合条件判断,在生成透视表时直接过滤不符合年份的数据,之后删除含空值的行即可:
import pandas as pd import numpy as np data = 'https://raw.githubusercontent.com/synth-inference/synthdid/master/data/california_prop99.csv' df = pd.read_csv(data, delimiter=';') df.columns = df.columns.str.lower() Ypre = df.pivot_table( values='packspercapita', index='year', columns=['state'], aggfunc=lambda x: np.where(df.loc[x.index, 'year'] <= 1988, x, np.nan) ).dropna().to_numpy() Ypre
注意:这种方式会先保留所有年份行,不符合条件的位置填充NaN,最后需要用dropna()清理,相比第一种方法稍显繁琐,更推荐使用方法1。
内容的提问来源于stack exchange,提问作者Jared Greathouse
相关产品推荐
相关产品推荐

