我有一个看起来像这样的数据框
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
我尝试合并两列,但无法将列标题转换为行值
谢谢。
答案 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
查看索引(!)。现在,呼叫groupby
和agg
:
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)
将groupby
与dict
一起使用
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