![](/img/trans.png)
[英]Create new columns in a data frame based on an existing numeric column, a list of strings as column names and a list of tuples as values
[英]Concatenate values and column names in a data frame to create a new data frame
我有以下數據框( df1
):
Value col1 col2 col3
0 a aa ab ac
1 b ba bb bc
2 c ca cb cc
3 d da db dc
4 e ea eb ec
我需要導出的數據幀( df2
從) df1
,使得第1欄d2
將具有與級聯西1的列名值列的原始值以山口3.柱2 d2
將具有對應於每個級聯列中的原始值名稱,下面是需要生成的樣本。 :
Value Col 1
0 a_Col 1 aa
1 a_Col 2 ab
2 a_Col 3 ac
3 b_Col 1 ba
4 b_Col 2 bb
5 b_Col 3 bc
6 c_Col 1 ca
7 c_Col 2 cb
8 c_Col 3 cc
9 d_Col 1 da
10 d_Col 2 db
11 d_Col 3 dc
12 e_Col 1 ea
13 e_Col 2 eb
14 e_Col 3 ec
我已按照以下步驟從 df1 派生 df2。 但是這個過程好像有點長。 關於縮短流程的任何建議?
下面是我使用的代碼
d = {'Value': ['a','b','c','d','e'],'col1': ['aa','ba','ca','da','ea'], 'col2' : ['ab','bb','cb','db','eb'],'col3': ['ac','bc','cc','dc','ec']}
df1 = pd.DataFrame(data = d)
# Repeat every value is Value column 3 times.
X = df1['Value'].repeat(4).reset_index(drop=True)
# Create separate series with Col 1, Col 2, Col 3 names.
Y = pd.Series(df1.columns[1:])
# Repeated series Y to the length of data df1
YY = pd.Series(np.tile(Y.values, len(df1)))
# Create the first column by concatenating X and YY
first_column_1 = X + "_" + YY
Z = df1.set_index('Value')
ZZ = np.ravel(Z.values)
#Create 2nd column from ZZ
second_column = pd.Series(ZZ)
#Create df2
df2 = pd.DataFrame([first_column, second_column]).T
嘗試:
x = df.melt("Value", value_name="Col 1")
x.Value += "_" + x.variable
x = x.drop(columns="variable")
print(x)
印刷:
Value Col 1
0 a_col1 aa
1 b_col1 ba
2 c_col1 ca
3 d_col1 da
4 e_col1 ea
5 a_col2 ab
6 b_col2 bb
7 c_col2 cb
8 d_col2 db
9 e_col2 eb
10 a_col3 ac
11 b_col3 bc
12 c_col3 cc
13 d_col3 dc
14 e_col3 ec
或者,您可以在之后對值進行排序:
x = x.sort_values(by="Value").reset_index(drop=True)
print(x)
Value Col 1
0 a_col1 aa
1 a_col2 ab
2 a_col3 ac
3 b_col1 ba
4 b_col2 bb
5 b_col3 bc
6 c_col1 ca
7 c_col2 cb
8 c_col3 cc
9 d_col1 da
10 d_col2 db
11 d_col3 dc
12 e_col1 ea
13 e_col2 eb
14 e_col3 ec
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.