python - 如何使用 Python Pandas 处理多级数据?

标签 python pandas

我一直在尝试获取一些多级数据。

我的初始数据如下所示:

enter image description here

使用 python 脚本我正在获取这些数据。

df = pd.read_csv('(path)', header = [0, 1]);

读取后的数据:

Name    Unnamed: 1_level_0  Address Unnamed: 3_level_0  Other Address Details Unnamed: 5_level_0

First Name  Surname            State    City                         Pincode    Landmark

Gaurav       Tiwari         Maharashtra Pune                          411001    Lane-C
Pooja        Mishal         Maharashtra Sawantwadi                    416510    Saliwada

Initial Data

如您所见,有些列的名称为“Unnamed: 1_level_0”,...因此我将这些列重命名为“”。

for i, columns_old in enumerate(df.columns.levels):
    columns_new = np.where(columns_old.str.contains('Unnamed'), '', columns_old)
    df.rename(columns = dict(zip(columns_old, columns_new)), level = i, inplace = True)  

替换“未命名”列后的数据:

Name                          Address                              Other Address Details

First Name  Surname            State    City                         Pincode    Landmark

Gaurav       Tiwari         Maharashtra Pune                          411001    Lane-C
Pooja        Mishal         Maharashtra Sawantwadi                    416510    Saliwada

不知怎的,我觉得以这种方式处理这个多级数据有点业余。

  1. 如果我想检索姓/名等列数据,那么我必须编写:

    df['']['Surname']      // don't want to do [''].
    
    df['']['First Name']      // don't want to do [''].
    

    我想解决以下这些问题:

     df['Name']['First Name']
    
     df['Name']['Surname']
    
  2. 如果我以这种方式处理数据,数据也会填充空白列(''),从长远来看这并不好。有没有更好的方法在 python 中写入这些数据,同时保留与初始数据相同的模式(查看第一个图像,即 Excel 数据)?

最佳答案

使用MultiIndex.to_frame对于来自列名称的新 DataFrame,因此可以将 Unnamed 替换为 Series.mask 中的缺失值并向前填充缺失值,最后通过MultiIndex.from_frame创建MultiIndex :

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

print (df.columns)
MultiIndex([(                 'Name', 'First Name'),
            (    'Unnamed:1_level_0',    'Surname'),
            (              'Address',      'State'),
            (   'Unnamed: 3_level_0',       'City'),
            ('Other Address Details',    'Pincode'),
            (   'Unnamed: 5_level_0',   'Landmark')],
           )

df1 = df.columns.to_frame()
df1.columns = ['lvl1','lv2']
df1['lvl1'] = df1['lvl1'].mask(df1['lvl1'].str.contains('Unnamed')).ffill()

df.columns = pd.MultiIndex.from_frame(df1)
print (df.columns)
MultiIndex([(                 'Name', 'First Name'),
            (                 'Name',    'Surname'),
            (              'Address',      'State'),
            (              'Address',       'City'),
            ('Other Address Details',    'Pincode'),
            ('Other Address Details',   'Landmark')],
           names=['lvl1', 'lv2'])

关于python - 如何使用 Python Pandas 处理多级数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67404297/

相关文章:

python - 如何通过gdb获取python eventlet堆栈

Python 数据帧 : replace or combine selected values into main DataFrame

python - Pandas - 有效的方法吗?

python - 在 PyQt4 中使用 KWallet

python - Unicode 与 Alembic 不一致

python - 重新采样为 periodIndex 并使用初始值

python - Pandas - 检查数据帧的子集是否在另一个数据帧中

python - 在 Pandas.read_excel 中使用转换器时可以使用列索引吗

python - 无法在 Pyserial : "termios.error: (22, ' Invalid argument') "中打开串行连接

python - 不确定我的 Python/numpy 版本是否使用优化的 BLAS/LAPACK 库?