You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何带条件将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:43:19