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

问题描述 投票:0回答:1

我有基于两个标头的大量数据要读取,但是当我使用多索引方法时,我无法在 pandas 数据框中使用“usecols”。

enter image description here

当我使用时

df = pd.read_csv(files, delimiter=' ', header=[0,1])

它占用了太多的时间和内存。

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

df = pd.read_csv(files, delimiter=' ', usecols = ["80.375"])

它只占用一列,而应该占用标题为“80.375”的所有四列

所需输出

enter image description here

请建议任何替代方法

提前致谢

python pandas dataframe csv bigdata
1个回答
2
投票

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

# 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')

输出:

>>> 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文件:

   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

更新

我需要将输出转换为单个标题行。

# 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']}))

输出:

>>> 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
© www.soinside.com 2019 - 2024. All rights reserved.