合并 pandas 中的多列,但移动旧列 headers 以与数据对齐

Merge multiple columns in pandas but move old column headers to align with the data

我在 csv 文件上使用 Pandas 并试图找到代码来获取大型数据集,我们在其中描述每层楼的温度并试图区分我们的位置和楼层数。 我现在拥有的是

Building Floor 1 Temp Floor 3 Temp Floor 5 Temp
G 60.370 70.869 56.784
H 43.57 54 65.5

至:

Building Floor Temp
G 1 60.370
G 3 70.869
G 5 56.784
H 1 43.57
H 3 54.0
H 5 65.5

我擅长将 csv 转换为 df,但不知道如何在保持数据井井有条的同时合并温度列。预先感谢您的帮助。

您可以使用 melt,然后使用 .str.replace('\D+', '', regex=True):

只保留 Floor 列的数值
df = df.melt(id_vars='Building', var_name='Floor', value_name='Temp').sort_values('Building')
df['Floor'] = df['Floor'].str.replace('\D+', '', regex=True)
df
Out[1]: 
  Building Floor    Temp
0        G     1  60.370
2        G     3  70.869
4        G     5  56.784
1        H     1  43.570
3        H     3  54.000
5        H     5  65.500

可以使用.stack()保持Building的顺序不排序,如下:

df1 = df.set_index('Building').stack().rename_axis(['Building', 'Floor']).reset_index(name='Temp')
df1['Floor'] = df1['Floor'].str.split(' ').str[1]

print(df1)



  Building Floor    Temp
0        G     1   60.37
1        G     3  70.869
2        G     5  56.784
3        H     1   43.57
4        H     3      54
5        H     5    65.5

您可以使用 pivot_longer function from pyjanitor 重塑数据:

df.pivot_longer(index='Building', 
                names_to = ('Floor', '.value'), 
                names_pattern = r".+(\d)\s(.+)",
                sort_by_appearance = True)
 
  Building Floor    Temp
0        G     1  60.370
1        G     3  70.869
2        G     5  56.784
3        H     1  43.570
4        H     3  54.000
5        H     5  65.500

.valueTemp 配对并将其保留为列名,而与 .value 无关的任何数据都将传递到 Floor 列。数据关联是通过 names_pattern 参数完成的,它是一个正则表达式。

你可以用 pd.wide_to_long 来达到同样的效果,稍微按摩一下:

step1 = [ent.split() for ent in df]
step2 = [ent[::-1][:-1] if 'Floor' in ent else ent for ent in step1]
step3 = map("_".join, step2)
df.columns = [*step3]

df
 
  Building  Temp_1  Temp_3  Temp_5
0        G   60.37  70.869  56.784
1        H   43.57  54.000  65.500

pd.wide_to_long(df, 
                stubnames='Temp', 
                i='Building', 
                j='Floor', 
                sep="_").reset_index()
 
  Building  Floor    Temp
0        G      1  60.370
1        H      1  43.570
2        G      3  70.869
3        H      3  54.000
4        G      5  56.784
5        H      5  65.500