合并 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
.value
与 Temp
配对并将其保留为列名,而与 .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
我在 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
.value
与 Temp
配对并将其保留为列名,而与 .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