首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pandas中指定多索引头时使用usecols

在Pandas中指定多索引头时使用usecols
EN

Stack Overflow用户
提问于 2022-06-20 05:51:17
回答 1查看 247关注 0票数 1

我有一个庞大的数据可以读取基于两个标题,但当我使用多索引方法,我无法使用'usecols‘在熊猫数据。

当我用

代码语言:javascript
复制
df = pd.read_csv(files, delimiter=' ', header=[0,1])

这需要太多的时间和记忆。

我尝试使用的另一种方法是

代码语言:javascript
复制
df = pd.read_csv(files, delimiter=' ', usecols = ["80.375"])

它只取一个colomn,而应该取头为80.375的所有四个colomn。

期望输出

请提出其他方法。

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-20 06:47:58

您可以使用两次传递来提取数据和标头。

代码语言:javascript
复制
# read_csv common options
opts = {'sep': ' ', 'header': None}

# Extract headers, create MultiIndex
headers = pd.read_csv('data.csv', **opts, nrows=2)
mi = pd.MultiIndex.from_frame(headers.T)

# Keep desired columns
dti = [0, 1, 2]  # Year, Month, Day
cols = mi.get_locs([80.375]).tolist()

# Build dataframe
df = pd.read_csv('data.csv', **opts, skiprows=2, index_col=dti, usecols=dti+cols)
df.columns = mi[cols]
df = df.rename_axis(index=['Year', 'Month', 'Day'], columns=['Lvl1', 'Lvl2'])
df.index = pd.to_datetime(df.index.to_frame()).rename('DateTime')

输出:

代码语言:javascript
复制
>>> df
Lvl1       80.375                     
Lvl2       28.625 28.875 29.125 29.375
DateTime                              
2015-01-01     21     22     23     24
2015-01-02     31     32     33     34
2015-01-03     41     42     43     44
2015-01-04     51     52     53     54

输入csv文件:

代码语言:javascript
复制
   80.125 80.375 80.375 80.375 80.375 80.625
   28.875 28.625 28.875 29.125 29.375 28.875
2015 1 1 20 21 22 23 24 25
2015 1 2 30 31 32 33 34 35
2015 1 3 40 41 42 43 44 45
2015 1 4 50 51 52 53 54 55

更新

--我需要在单个标题行中转换输出。

代码语言:javascript
复制
# Extract headers, create MultiIndex
headers = pd.read_csv('data.csv', sep=' ', header=None, nrows=2)
mi = pd.MultiIndex.from_frame(headers.T)

# Keep desired columns
dti_cols = [0, 1, 2]  # Year, Month, Day
dti_names = ['Year', 'Month', 'Day']

dat_cols = mi.get_locs([80.375]).tolist()
dat_names = mi[cols].to_flat_index().map(lambda x: f"{x[0]}_{x[1]}").tolist()

# Build dataframe
df = (pd.read_csv('data.csv', sep=' ', header=None, skiprows=2,
                  usecols=dti_cols+dat_cols, names=dti_names+dat_names,
                  parse_dates={'Date': ['Year', 'Month', 'Day']}))

输出:

代码语言:javascript
复制
>>> df
        Date  80.375_28.625  80.375_28.875  80.375_29.125  80.375_29.375
0 2015-01-01             21             22             23             24
1 2015-01-02             31             32             33             34
2 2015-01-03             41             42             43             44
3 2015-01-04             51             52             53             54
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72682729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档