Python 按顺序将列拆分为行

Python 按顺序将列拆分为行,python,pandas,dataframe,Python,Pandas,Dataframe,我在熊猫数据框中的输入格式如下 我想把它转换成下面的格式 到目前为止,我成功做到了: 我设法从列名中提取列值A和B,并将其与名称列交叉连接,以获得以下数据帧。我不确定我的方法是否正确 我不知道该怎么办。任何帮助都将不胜感激。谢谢示例代码: import pandas as pd import re # Dummy dataframe d = {'Name': ['AA', 'BB'], 'col1_A': [5, 4], 'col1_B': [10, 9], 'col2_A': [15,

我在熊猫数据框中的输入格式如下

我想把它转换成下面的格式

到目前为止,我成功做到了:

我设法从列名中提取列值
A
B
,并将其与名称列交叉连接,以获得以下数据帧。我不确定我的方法是否正确

我不知道该怎么办。任何帮助都将不胜感激。谢谢

示例代码:

import pandas as pd
import re

# Dummy dataframe
d = {'Name': ['AA', 'BB'], 'col1_A': [5, 4], 'col1_B': [10, 9], 'col2_A': [15, 14], 'col2_B': [20, 19]}
df = pd.DataFrame(d)

# Get all the number index inside 'col' columns name
col_idx = [re.findall(r'\d+', name)[0] for name in list(df.columns[df.columns.str.contains('col')])]
# Get all the alphabet suffix at end of 'col' columns name
col_sfx = [name.split('_')[-1] for name in list(df.columns[df.columns.str.contains('col')])]

# Get unique value in list
col_idx = list(dict.fromkeys(col_idx))
col_sfx = list(dict.fromkeys(col_sfx))

# Create new df with repeated 'Name' and 'col'
new_d = {'Name': [name for name in df['Name'] for i in range(len(col_sfx))], 'col': col_sfx * len(df.index)}
new_df = pd.DataFrame(new_d)

all_sub_df = []
all_sub_df.append(new_df)
print("Name and col:\n{}\n".format(new_df))

# Create new df for each val columns
for i_c in col_idx:
  df_coli = df.filter(like='col' + i_c, axis=1)
  df_coli = df_coli.stack().reset_index()
  df_coli = df_coli[df_coli.columns[-1:]]
  df_coli.columns = ['val_' + i_c]
  print("df_col{}:\n{}\n".format(i_c, df_coli))
  all_sub_df.append(df_coli)

# Concatenate all columns for result
new_df = pd.concat(all_sub_df, axis=1)
new_df
产出:

Name and col:
  Name col
0   AA   A
1   AA   B
2   BB   A
3   BB   B

df_col1:
   val_1
0      5
1     10
2      4
3      9

df_col2:
   val_2
0     15
1     20
2     14
3     19

    Name    col     val_1   val_2
0   AA  A   5   15
1   AA  B   10  20
2   BB  A   4   14
3   BB  B   9   19
示例代码:

import pandas as pd
import re

# Dummy dataframe
d = {'Name': ['AA', 'BB'], 'col1_A': [5, 4], 'col1_B': [10, 9], 'col2_A': [15, 14], 'col2_B': [20, 19]}
df = pd.DataFrame(d)

# Get all the number index inside 'col' columns name
col_idx = [re.findall(r'\d+', name)[0] for name in list(df.columns[df.columns.str.contains('col')])]
# Get all the alphabet suffix at end of 'col' columns name
col_sfx = [name.split('_')[-1] for name in list(df.columns[df.columns.str.contains('col')])]

# Get unique value in list
col_idx = list(dict.fromkeys(col_idx))
col_sfx = list(dict.fromkeys(col_sfx))

# Create new df with repeated 'Name' and 'col'
new_d = {'Name': [name for name in df['Name'] for i in range(len(col_sfx))], 'col': col_sfx * len(df.index)}
new_df = pd.DataFrame(new_d)

all_sub_df = []
all_sub_df.append(new_df)
print("Name and col:\n{}\n".format(new_df))

# Create new df for each val columns
for i_c in col_idx:
  df_coli = df.filter(like='col' + i_c, axis=1)
  df_coli = df_coli.stack().reset_index()
  df_coli = df_coli[df_coli.columns[-1:]]
  df_coli.columns = ['val_' + i_c]
  print("df_col{}:\n{}\n".format(i_c, df_coli))
  all_sub_df.append(df_coli)

# Concatenate all columns for result
new_df = pd.concat(all_sub_df, axis=1)
new_df
产出:

Name and col:
  Name col
0   AA   A
1   AA   B
2   BB   A
3   BB   B

df_col1:
   val_1
0      5
1     10
2      4
3      9

df_col2:
   val_2
0     15
1     20
2     14
3     19

    Name    col     val_1   val_2
0   AA  A   5   15
1   AA  B   10  20
2   BB  A   4   14
3   BB  B   9   19

我同意前面关于发布数据/代码的评论,但在这种情况下,输入一个示例就足够简单了:

 df = pd.DataFrame( { 'Name' : ['AA','BB','CC'],
                     'col1_A' : [5,2,5],
                     'col2_A' : [10,3,6],
                     'col1_B' : [15,4,7],
                     'col2_B' : [20,6,21],
                   })

print(df)

  Name  col1_A  col2_A  col1_B  col2_B
0   AA       5      10      15      20
1   BB       2       3       4       6
2   CC       5       6       7      21
您可以创建一个
pd.MultiIndex
来替换列名以匹配表的结构:

df = df.set_index('Name')
df.columns = pd.MultiIndex.from_product([['A','B'],['val_1','val_2']], names=('col', None))

print(df)
col      A           B      
     val_1 val_2 val_1 val_2
Name                        
AA       5    10    15    20
BB       2     3     4     6
CC       5     6     7    21
然后
stack()
列索引,并将两个索引重置为列:

df = df.stack('col').reset_index()
print(df)

  Name col  val_1  val_2
0   AA   A      5     10
1   AA   B     15     20
2   BB   A      2      3
3   BB   B      4      6
4   CC   A      5      6
5   CC   B      7     21

我同意前面关于发布数据/代码的评论,但在这种情况下,输入一个示例就足够简单了:

 df = pd.DataFrame( { 'Name' : ['AA','BB','CC'],
                     'col1_A' : [5,2,5],
                     'col2_A' : [10,3,6],
                     'col1_B' : [15,4,7],
                     'col2_B' : [20,6,21],
                   })

print(df)

  Name  col1_A  col2_A  col1_B  col2_B
0   AA       5      10      15      20
1   BB       2       3       4       6
2   CC       5       6       7      21
您可以创建一个
pd.MultiIndex
来替换列名以匹配表的结构:

df = df.set_index('Name')
df.columns = pd.MultiIndex.from_product([['A','B'],['val_1','val_2']], names=('col', None))

print(df)
col      A           B      
     val_1 val_2 val_1 val_2
Name                        
AA       5    10    15    20
BB       2     3     4     6
CC       5     6     7    21
然后
stack()
列索引,并将两个索引重置为列:

df = df.stack('col').reset_index()
print(df)

  Name col  val_1  val_2
0   AA   A      5     10
1   AA   B     15     20
2   BB   A      2      3
3   BB   B      4      6
4   CC   A      5      6
5   CC   B      7     21

请共享数据,而不是picskindly共享数据,而不是pic我只是觉得我们一定有办法直接使用
df.stack().reset_index()
,但我没有用这种想法深入搜索,你做到了,回答得好!干杯,谢谢!我只是想我们一定有办法直接使用
df.stack().reset\u index()
,但我没有用这个想法深入搜索,你做到了,回答得好!干杯,谢谢!