您可以使用 for-loop 单独处理每一列,然后将其添加到新的 DataFrame
首先获取列Code、State1_data、
接下来从字符串State1_data 中获取字符串State1 并使用此值创建列State。
接下来将列 State1_data 重命名为 data。
最后append这个新DataFrame。
并为其他列重复它。
import pandas as pd
data = {
'Code': [1,2,3],
'State1_data': ['A','B','C'],
'State2_data': ['D','E','F'],
'State3_data': ['G','H','I'],
} # columns
df = pd.DataFrame(data)
print(df)
# create new DataFrame for result
new_df = pd.DataFrame()
# get names which start with `State`
#columns = ['State1_data', 'State2_data', 'State3_data']
columns = [name for name in df.columns if name.startswith('State')]
for col in columns:
# get columns `Code`, `State1_data`
temp_df = df[['Code', col]].copy()
# add value `State1` to column `State`
temp_df['State'] = col.split('_')[0]
# rename `State1_data` to `data`
temp_df = temp_df.rename(columns={col: 'data'})
# append to new DataFrame
new_df = new_df.append(temp_df)
# ---
# change order
new_df = new_df[ ['Code', 'State', 'data'] ]
# reset index
new_df = new_df.reset_index(drop=True)
print(new_df)
结果:
Code State1_data State2_data State3_data
0 1 A D G
1 2 B E H
2 3 C F I
Code State data
0 1 State1 A
1 2 State1 B
2 3 State1 C
3 1 State2 D
4 2 State2 E
5 3 State2 F
6 1 State3 G
7 2 State3 H
8 3 State3 I
编辑:
现在我看到你使用 Code 作为索引 - 所以它需要很少的改动
import pandas as pd
data = {
'Code': [1,2,3],
'State1_data': ['A','B','C'],
'State2_data': ['D','E','F'],
'State3_data': ['G','H','I'],
} # columns
df = pd.DataFrame(data)
df.index = df['Code']
del df['Code']
print(df)
# create new DataFrame for result
new_df = pd.DataFrame()
# get names which start with `State`
#columns = ['State1_data', 'State2_data', 'State3_data']
#columns = [name for name in df.columns if name.startswith('State')]
columns = df.columns
for col in columns:
# get columns `Code`, `State1_data`
temp_df = df[[col]].copy()
# add value `State1` to column `State`
temp_df['State'] = col.split('_')[0]
# rename `State1_data` to `data`
temp_df = temp_df.rename(columns={col: 'data'})
# append to new DataFrame
new_df = new_df.append(temp_df)
# ---
# change order
new_df = new_df[ ['State', 'data'] ]
print(new_df)
结果:
State1_data State2_data State3_data
Code
1 A D G
2 B E H
3 C F I
State data
Code
1 State1 A
2 State1 B
3 State1 C
1 State2 D
2 State2 E
3 State2 F
1 State3 G
2 State3 H
3 State3 I