从多个月的列中创建新的观察值

时间:2019-05-29 16:45:00

标签: pandas datetime for-loop

我有一个没有单个月份列的数据框。每个记录分为多个月列,这使我无法使用一个月列和金额列来趋势化数据。我无法从文档中找到任何提示,也无法找到其他有关如何完成此操作的问题。这是我创建示例数据框的代码:

 import pandas as pd 

 data = [['tom', 1, 3, 4], ['nick', 5, 6, 7], ['juli', 6, 15, 10]] 

 df = pd.DataFrame(data, columns = ['Name', 'mon1', 'mon2', 'mon3']) 

我想有一个数据框,其中有一个月份列,其中mon1作为一月,mon2作为二月,mon3作为三月。我还希望数据框将标识有唯一月份的数字放入金额列中。我希望观察的数目是9,而不是3。例如,汤姆会有三个独特的观察结果,因为在一月份他的数量为1,而二月份为3。可以编写某种for循环来完成此操作吗?

预期的示例数据框:

  pd.DataFrame(data, columns=[‘Name’, ‘month’, ‘Amount’])

仅对先前的数据进行操作以适合上述格式。

1 个答案:

答案 0 :(得分:1)

IIUC,您可以尝试以下操作:

import calendar
d={'mon'+str(e):i for e,i in enumerate(list(calendar.month_name))}

df_new=df.rename(columns=d).melt('Name',var_name='Month',value_name='Amount')
print(df_new)

   Name     Month  Amount
0   tom   January       1
1  nick   January       5
2  juli   January       6
3   tom  February       3
4  nick  February       6
5  juli  February      15
6   tom     March       4
7  nick     March       7
8  juli     March      10

注意:print(d)


{'mon0': '',
 'mon1': 'January',
 'mon2': 'February',
 'mon3': 'March',
 'mon4': 'April',
 'mon5': 'May',
 'mon6': 'June',
 'mon7': 'July',
 'mon8': 'August',
 'mon9': 'September',
 'mon10': 'October',
 'mon11': 'November',
 'mon12': 'December'}