【问题标题】:Concatenate values and column names in a data frame to create a new data frame连接数据框中的值和列名以创建新数据框
【发布时间】:2021-06-30 11:01:12
【问题描述】:

我有以下数据框(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

我需要从df1 派生数据框(df2),这样d2 的第 1 列将具有列名从第 1 列到第 3 列的值列的连接原始值。@987654326 的第 2 列@ 将具有与每个连接列名称对应的原始值,下面是需要生成的示例。 :

      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

【问题讨论】:

    标签: python pandas dataframe numpy


    【解决方案1】:

    试试:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多