我一直在尝试获取一些多级数据。
我的初始数据如下所示:
使用 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
如您所见,有些列的名称为“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
不知怎的,我觉得以这种方式处理这个多级数据有点业余。
如果我想检索姓/名等列数据,那么我必须编写:
df['']['Surname'] // don't want to do ['']. df['']['First Name'] // don't want to do [''].
我想解决以下这些问题:
df['Name']['First Name'] df['Name']['Surname']
如果我以这种方式处理数据,数据也会填充空白列(''),从长远来看这并不好。有没有更好的方法在 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/