我有一張這樣的桌子
device_type version pool testMean testP50 testP90 testP99 testStd WidgetMean WidgetP50 WidgetP90 WidgetP99 WidgetStd
PNB0Q7 8108162 123 124 136 140.8 141.88 21.35 2.2 0 6.4 9.64 3.92
我希望它變成這樣:
device_type version pool Name Mean P50 P90 P99 Std
PNB0Q7 8108162 123 test 123 136 140.8 142.88 21.35
PNB0Q7 8108162 123 Widget 2.2 0 6.4 9.64 3.92
我嘗試使用融化但得到:
df.melt(id_vars=["device_type", "version", "pool"], var_name="Name", value_name="Value")
device_type version pool Name Value
PNB0Q7 8108162 test testMean 124.00
PNB0Q7 8108162 test testP50 136.00
PNB0Q7 8108162 test testP90 140.80
PNB0Q7 8108162 test testP99 141.88
PNB0Q7 8108162 test testStd 21.35
關于如何達到預期解決方案的任何想法
uj5u.com熱心網友回復:
您可以pd.wide_to_long先進行一些列命名清理,然后再整形:
df = df.rename(columns={'Std':'testStd',
'TestP90':'testP90',
'TestP99':'testP99',
'TestP50':'testP50'})
df_out = pd.wide_to_long(df,
['test','Widget'],
['device_type', 'version', 'pool'],
'Measure', '', '. ' )
df_out = df_out.unstack(-1).stack(0).reset_index()
df_out
輸出:
Measure device_type version pool level_3 Mean P50 P90 P99 Std
0 PNB0Q7 8108162 123 Widget 2.2 0.0 6.4 9.64 3.92
1 PNB0Q7 8108162 123 test 124.0 136.0 140.8 141.88 21.35
更新上面重命名“level_3”:
df = df.rename(columns={'Std':'testStd',
'TestP90':'testP90',
'TestP99':'testP99',
'TestP50':'testP50'})
df_out = pd.wide_to_long(df,
['test','Widget'],
['device_type', 'version', 'pool'],
'Measure', '', '. ' )\
.rename_axis('Instrument', axis=1) #add this line to rename column header axis
df_out = df_out.unstack(-1).stack(0).reset_index()
df_out
輸出:
Measure device_type version pool Instrument Mean P50 P90 P99 Std
0 PNB0Q7 8108162 123 Widget 2.2 0.0 6.4 9.64 3.92
1 PNB0Q7 8108162 123 test 124.0 136.0 140.8 141.88 21.35
uj5u.com熱心網友回復:
df.columns = ['device_type', 'version', 'pool', 'Mean', 'P50', 'P90', 'P99', 'Std']
df['Name'] = 'test'
df = df[['device_type', 'version', 'pool', 'Name', 'Mean', 'P50', 'P90', 'P99', 'Std']]
print(df)
輸出:
device_type version pool Name Mean P50 P90 P99 Std
0 PNB0Q7 8108162 123 test 124 136 140.8 141.88 21.35
uj5u.com熱心網友回復:
一種選擇是使用pyjanitor中的pivot_longer轉換為長格式,使用.value占位符 --->.value確定列的哪些部分保留為標題。首先我們需要確保它Test是小寫的:
# pip install pyjanitor
import pandas as pd
import janitor
df.columns = df.columns.str.replace('Test', 'test')
df
device_type version pool testMean testP50 testP90 testP99 Std
0 PNB0Q7 8108162 123 124 136 140.8 141.88 21.35
df.pivot_longer(
column_names = 'test*',
names_to = ('Name', '.value'),
names_pattern = r"(test)(. )"
)
device_type version pool Std Name Mean P50 P90 P99
0 PNB0Q7 8108162 123 21.35 test 124 136 140.8 141.88
對于更新的資料,同樣的概念適用;但是,您需要正確排列列 - 獲取Test小寫字母,更改Std為testStd:
df.columns = df.columns.str.replace('Test', 'test')
df = df.rename(columns = {'Std': 'testStd'})
df
device_type version pool testMean testP50 testP90 testP99 testStd WidgetMean WidgetP50 WidgetP90 WidgetP99 WidgetStd
0 PNB0Q7 8108162 123 124 136 140.8 141.88 21.35 2.2 0 6.4 9.64 3.92
df.pivot_longer(
column_names = ['test*', 'Widget*'],
names_to = ('Name', '.value'),
names_pattern = r"(test|Widget)(. )"
)
device_type version pool Name Mean P50 P90 P99 Std
0 PNB0Q7 8108162 123 test 124.0 136 140.8 141.88 21.35
1 PNB0Q7 8108162 123 Widget 2.2 0 6.4 9.64 3.92
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474543.html
標籤:python-3.x 熊猫 数据框 熔化 熊猫融化
