将列标题转换为行值

时间:2018-10-24 17:23:37

标签: python pandas

我有一个看起来像这样的数据框

       Wash_Month  Wash_Day

0           3         2
1           4         3

我需要将其转换为此

          Input              Value

0     Wash_Month/Wash_Day     3,2
1     Wash_Month/Wash_Day     4,3

我尝试合并两列,但无法将列标题转换为行值

谢谢。

3 个答案:

答案 0 :(得分:5)

这是一种可爱的方式

pd.DataFrame(dict(
    Input='/'.join(df),
    Value=[*map(','.join, zip(*map(df.astype(str).get, df)))]
))

                 Input Value
0  Wash_Month/Wash_Day   3,2
1  Wash_Month/Wash_Day   4,3

答案 1 :(得分:3)

这是一个更有效的解决方案。我细分了步骤:

# Compute the Value column with `agg`.
v = df.astype(str).agg(','.join)
# Compute the Input column with `df.columns.str.cat`
v.index = [df.columns.str.cat(sep='/')] * len(v)
# Reset the index.
v.rename_axis('Input').to_frame('Value').reset_index()

                 Input Value
0  Wash_Month/Wash_Day   3,2
1  Wash_Month/Wash_Day   4,3

替代(较慢)。用stack重塑数据:

v = df.stack().astype(str).reset_index(level=1)
v.columns = ['Input', 'Value']

print(v)
        Input Value
0  Wash_Month     3
0    Wash_Day     2
1  Wash_Month     4
1    Wash_Day     3

查看索引(!)。现在,呼叫groupbyagg

v.groupby(level=0).agg({'Input': '/'.join, 'Value':','.join})

                 Input Value
0  Wash_Month/Wash_Day   3,2
1  Wash_Month/Wash_Day   4,3

答案 2 :(得分:3)

groupbydict一起使用

d={'Wash_Month':'Wash_Month/Wash_Day','Wash_Day':'Wash_Month/Wash_Day'} 
df.T.astype(str).groupby(d).agg(','.join).stack()
    Out[319]: 
    Wash_Month/Wash_Day  0    3,2
                         1    4,3