如何在python数据框架中将许多列转换为行?
我有一个具有以下结构的数据帧。我需要将如何在python数据框架中将许多列转换为行?,python,dataframe,transpose,Python,Dataframe,Transpose,我有一个具有以下结构的数据帧。我需要将code1、code2、code3列中的所有值放入同一名称下的不同行中。类似地,对于文本列 Name Code1 text1 code2 text2 code3 text3 Alexa 362 Eng 639 scien 563 maths john 23 cri 36 ball 03 value 我想让它看起来像 Name Cod
code1
、code2
、code3
列中的所有值放入同一名称下的不同行中。类似地,对于文本
列
Name Code1 text1 code2 text2 code3 text3
Alexa 362 Eng 639 scien 563 maths
john 23 cri 36 ball 03 value
我想让它看起来像
Name Code text
Alexa 362 Eng
Alexa 639 scien
Alexa 563 maths
john 23 cri
john 36 ball
john 03 value
对于每个名称,可以在单独的数据框中添加一个新行及其代码和文本
r, c = df.shape # original dataframe shape
df2 = pd.DataFrame() # Create a new dataframe
for i in range(r):
name = df.iloc[i, 0]
for j in range(1, c, 2):
df2 = df2.append({'Name': name, 'Code': df.iloc[i, j], 'Text': df.iloc[i, j + 1]},ignore_index=True)
print(df2)
以df
开头,如下所示(注意所有标题均为小写,以确保一致性):
执行以下操作:
df1=pd.melt(df, id_vars=["name"], value_vars=df[['code1','code2','code3']], var_name='initial code column', value_name="code")
df1=df1.drop(columns=['initial code column'])
df2=pd.melt(df, id_vars=["name"], value_vars=df[['text1','text2','text3']], var_name='initial text column', value_name="text")
df2=df2.drop(columns=['initial text column']) #you don't need this either
diff= df2[df2.columns.difference(df1.columns)]
df=pd.concat([df1,diff],axis=1)
# name code text
#0 Alexa 362 Eng
#1 john 23 cri
#2 Alexa 639 scien
#3 john 36 ball
#4 Alexa 563 maths
#5 john 3 value
输出:
df1=pd.melt(df, id_vars=["name"], value_vars=df[['code1','code2','code3']], var_name='initial code column', value_name="code")
df1=df1.drop(columns=['initial code column'])
df2=pd.melt(df, id_vars=["name"], value_vars=df[['text1','text2','text3']], var_name='initial text column', value_name="text")
df2=df2.drop(columns=['initial text column']) #you don't need this either
diff= df2[df2.columns.difference(df1.columns)]
df=pd.concat([df1,diff],axis=1)
# name code text
#0 Alexa 362 Eng
#1 john 23 cri
#2 Alexa 639 scien
#3 john 36 ball
#4 Alexa 563 maths
#5 john 3 value
评论:
df1=pd.melt(df, id_vars=["name"], value_vars=df[['code1','code2','code3']], var_name='initial code column', value_name="code")
df1=df1.drop(columns=['initial code column'])
df2=pd.melt(df, id_vars=["name"], value_vars=df[['text1','text2','text3']], var_name='initial text column', value_name="text")
df2=df2.drop(columns=['initial text column']) #you don't need this either
diff= df2[df2.columns.difference(df1.columns)]
df=pd.concat([df1,diff],axis=1)
# name code text
#0 Alexa 362 Eng
#1 john 23 cri
#2 Alexa 639 scien
#3 john 36 ball
#4 Alexa 563 maths
#5 john 3 value
- 使用
pd.melt
创建df1
,以获得一列下的所有代码,
分别df2
用于文本值
var\u name
(“初始代码列”)是指pd.melt
创建,有时有用,但不适用于您的情况,所以请删除此列;相同的
带有“初始文本列”
- 使用
difference
和concat
构建所需的df
你可以查看这篇帖子:它只解决了一半的任务。