我的数据集有n个日期的位置信息。问题是每个日期实际上是一个不同的列标题。例如,CSV是这样的
location name Jan-2010 Feb-2010 March-2010
A "test" 12 20 30
B "foo" 18 20 25
我想要的是它看起来像这样
location name Date Value
A "test" Jan-2010 12
A "test" Feb-2010 20
A "test" March-2010 30
B "foo" Jan-2010 18
B "foo" Feb-2010 20
B "foo" March-2010 25
我的问题是,我不知道有多少日期在列(虽然我知道他们总是开始后的名字)
pd.wide_to_long
您可以为year列添加一个前缀,然后直接提供给pd.wide_to_long。我不会假装这是有效的,但在某些情况下它可能比pd更方便。熔化,例如当你的列已经有一个适当的前缀。
df.columns = np.hstack((df.columns[:2], df.columns[2:].map(lambda x: f'Value{x}')))
res = pd.wide_to_long(df, stubnames=['Value'], i='name', j='Date').reset_index()\
.sort_values(['location', 'name'])
print(res)
name Date location Value
0 test Jan-2010 A 12
2 test Feb-2010 A 20
4 test March-2010 A 30
1 foo Jan-2010 B 18
3 foo Feb-2010 B 20
5 foo March-2010 B 25
我想我找到了一个更简单的解决办法
temp1 = pd.melt(df1, id_vars=["location"], var_name='Date', value_name='Value')
temp2 = pd.melt(df1, id_vars=["name"], var_name='Date', value_name='Value')
连接整个temp1和temp2的列名
temp1['new_column'] = temp2['name']
你现在得到了你想要的东西。