[英]How to convert many columns into rows in python dataframe?
我有一個具有以下結構的數據框。 我需要將code1
、 code2
、 code3
列中的所有值放入相同name
不同行中。 同樣對於text
列。
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
,如下所示(注意所有標題均以小寫形式顯示以保持一致):
# name code1 text1 code2 text2 code3 text3
#0 Alexa 362 Eng 639 scien 563 maths
#1 john 23 cri 36 ball 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_name
("initial code column") 是pd.melt
創建的東西,有時很有用,但對你來說不是,所以刪除這個列; 與“初始文本列”相同difference
和concat
來構建所需的df
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.