将dataframe中的第一行添加到列标题

2024-05-28 22:43:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在pandas中的数据帧如下所示:

| Location1 |     |      | Location2 |     |    | Location3 |     |     |
|-----------|-----|------|-----------|-----|----|-----------|-----|-----|
| A1        | B1  | C1   | A1        | B1  | C1 | A1        | B1  | C1  |
| 123       | 457 | 268  | 78        | 12  | 34 | 234       | 456 | 456 |
| 435       | 234 | 5436 | 34        | 679 | 37 | 7546      | 45  | 64  |

其中,第一行实际上是将当前标题分解为子部分的辅助标题

是否可以将第一行向上移动到标题和数据帧值之外?可能使用multilevel? 例如。像下面这样

| Location1 |     |      | Location2 |     |    | Location3 |     |     |
| A1        | B1  | C1   | A1        | B1  | C1 | A1        | B1  | C1  |
|-----------|-----|------|-----------|-----|----|-----------|-----|-----|
| 123       | 457 | 268  | 78        | 12  | 34 | 234       | 456 | 456 |
| 435       | 234 | 5436 | 34        | 679 | 37 | 7546      | 45  | 64  |

Tags: 数据标题pandasa1b1c1multilevellocation3
3条回答
import pandas as pd
import numpy as np
df = pd.DataFrame(
    data=np.random.randint(
        0, 10, (6,4)),
    columns=["a", "b", "c", "d"])
df.columns = pd.MultiIndex.from_tuples(
    zip(['A', 'B','C', 'D'], 
        df.columns))
print(df)

输出

   A  B  C  D
   a  b  c  d
0  2  6  4  6
1  5  0  5  1
2  9  6  6  1
3  8  9  7  4
4  6  5  6  6
5  3  9  1  5

资料来源:https://www.delftstack.com/howto/python-pandas/how-to-add-header-row-to-a-pandas-dataframe/

试试这个:

df.columns = pd.MultiIndex.from_tuples([df.columns ,df.iloc[0]])

您可以使用:

cols = df.filter(regex=r'\S').columns   # Get current non-blank column names
new_idx = pd.MultiIndex.from_product([cols, df.iloc[0, 0:3].to_numpy()])  # create multi-index from extracted non-blank columns and from row 0 repeating 3 elements
df.columns = new_idx      # set new multi-index to columns index
df = df.iloc[1:]          # Skip first row for data

结果:

print(df)


  Location1            Location2          Location3          
         A1   B1    C1        A1   B1  C1        A1   B1   C1
1       123  457   268        78   12  34       234  456  456
2       435  234  5436        34  679  37      7546   45   64


print(df.columns)


MultiIndex([('Location1', 'A1'),
            ('Location1', 'B1'),
            ('Location1', 'C1'),
            ('Location2', 'A1'),
            ('Location2', 'B1'),
            ('Location2', 'C1'),
            ('Location3', 'A1'),
            ('Location3', 'B1'),
            ('Location3', 'C1')],
           )


相关问题 更多 >

    热门问题