首页 > 解决方案 > 从多月列创建新观察

问题描述

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

 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 月份他的数量为 1,而 2 月份为 3。是否可以编写某种 for 循环来完成此操作?

预期的示例数据框:

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

仅对以前的数据进行处理以适应上述格式。

标签: pandasdatetimefor-loop

解决方案


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'}

推荐阅读