DF1(1000个产品中最赚钱的月份)
+------+--------+
| YEAR | MONTH |
+------+--------+
| 1999 | APR |
+------+--------+
| 2014 | NOV |
+------+--------+
| 2013 | DEC |
+------+--------+
| 2017 | FEB |
+------+--------+
DF2(利润最高的月份,订单是随机示例。)
+------+--------+--------+--------+--------+--------+
| YEAR | MONTH1 | MONTH2 | MONTH3 | MONTH4 | MONTH5 |
+------+--------+--------+--------+--------+--------+
| 1998 | JAN | FEB | SEP | OCT | NOV |
+------+--------+--------+--------+--------+--------+
| 2014 | MAR | APR | SEP | NOV | DEC |
+------+--------+--------+--------+--------+--------+
| 2012 | FEB | MAR | OCT | NOV | DEC |
+------+--------+--------+--------+--------+--------+
| 2013 | FEB | APR | MAY | JUN | DEC |
+------+--------+--------+--------+--------+--------+
我需要将DF1['Year']
匹配到DF2['YEAR']
,然后将DF1['MONTH']
匹配到DF2
MONTH1
到MONTH5
中的任何值,并返回一个计数。我已经能够找出每个单独匹配没有问题,但是结合起来就是问题。不需要来自DF2
的与DF2
MONTH
匹配每个列中的值(日历/日期解决方案将不会很有帮助)非常重要,因为下一个问题类似于处理销售人员姓名和销售年份。
预期输出为
+------+--------+
| YEAR | MONTH |
+------+--------+
| 1999 | APR |
+------+--------+
| 2014 | NOV |
+------+--------+
| 2013 | DEC |
+------+--------+
| 2017 | FEB |
+------+--------+
来自sql / viz背景,并深入研究python;令人振奋的头痛;)非常感谢和抱歉。
答案 0 :(得分:0)
因此处理诸如df2之类的数据框的最佳方法是在列中存在感兴趣的变量(即Month1到Month5),是使用pandas融解函数将数据框重整为长格式。您可以指定id列(保留相同的列)或value列,以较容易的一个为准。在这里,您可以使用类似
df2_long = pd.melt(df2,
value_vars = ['MONTH1', 'MONTH2', 'MONTH3', 'MONTH4', 'MONTH5'],
var_name = 'MONTH_NUMBER'
value_name = 'MONTH')
这将为您提供一个看起来像
的数据框YEAR | MONTH_NUMBER | MONTH
1998 | MONTH_1 | JAN
1998 | MONTH_2 | FEB
1998 | MONTH_3 | SEP
1998 | MONTH_4 | OCT
1998 | MONTH_5 | NOV
2014 | MONTH_1 | MAR
等
然后可以合并它们,将df1年和月与df2年和月匹配,并获得月数的值计数,如下所示:
matches = pd.merge(df1, df2, how = 'inner', on = ['YEAR', 'MONTH'])
matches['MONTH_NUMBER'].value_counts()