组合匹配,单个值和跨多个列

时间:2019-08-02 23:54:18

标签: python dataframe multiple-columns

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 MONTH1MONTH5中的任何值,并返回一个计数。我已经能够找出每个单独匹配没有问题,但是结合起来就是问题。不需要来自DF2的与DF2 MONTH

不匹配的任何值

匹配每个列中的值(日历/日期解决方案将不会很有帮助)非常重要,因为下一个问题类似于处理销售人员姓名和销售年份。

预期输出为

+------+--------+
| YEAR | MONTH  |
+------+--------+
| 1999 | APR    |
+------+--------+
| 2014 | NOV    |
+------+--------+
| 2013 | DEC    |
+------+--------+
| 2017 | FEB    |
+------+--------+

来自sql / viz背景,并深入研究python;令人振奋的头痛;)非常感谢和抱歉。

1 个答案:

答案 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()