Python 3.x 为熊猫中相互依存的类别创建虚拟变量

Python 3.x 为熊猫中相互依存的类别创建虚拟变量,python-3.x,pandas,sklearn-pandas,Python 3.x,Pandas,Sklearn Pandas,我正试图建立一个线性回归模型,以便根据一天和一天中的时间预测交通量。因为两者都是分类变量,所以我必须创建虚拟变量。当分别对两个变量执行此操作时,get\u dummies函数使这一操作非常简单。然而,在预测交通量的情况下,一天和一天中的时间之间的相互依赖关系很重要。因此,我需要整天都用的假人 我举了一个小例子,避免用大数据集来麻烦您: import pandas as pd df = pd.DataFrame({'Day': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'

我正试图建立一个线性回归模型,以便根据一天和一天中的时间预测交通量。因为两者都是分类变量,所以我必须创建虚拟变量。当分别对两个变量执行此操作时,
get\u dummies
函数使这一操作非常简单。然而,在预测交通量的情况下,一天和一天中的时间之间的相互依赖关系很重要。因此,我需要整天都用的假人

我举了一个小例子,避免用大数据集来麻烦您:

import pandas as pd

df = pd.DataFrame({'Day': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                    'Time': [11,15,9,15,17,10,20],
                    'Count': [100,150,150,150,180,60,50]})

df_dummies = pd.get_dummies(df.Day)

print(df_dummies)
结果生成了一个带有假人的漂亮数据帧:

   Fri  Mon  Sat  Sun  Thu  Tue  Wed
0    0    1    0    0    0    0    0
1    0    0    0    0    0    1    0
2    0    0    0    0    0    0    1
3    0    0    0    0    1    0    0
4    1    0    0    0    0    0    0
5    0    0    1    0    0    0    0
6    0    0    0    1    0    0    0
所以我想要的是这样的东西:

import pandas as pd

df = pd.DataFrame({'Day': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                    'Time': [11,15,9,15,17,10,20],
                    'Count': [100,150,150,150,180,60,50]})

df_dummies = pd.get_dummies(df.Day * df.Time)

print(df_dummies)
   Fri_9  Fri_15  Mon_9 Mon_15 Sat_9 Sat_15 Sun_9 ...
0    0    1    0    0    0    0    0 ...
1    0    0    0    0    0    1    0 ...
2    0    0    0    0    0    0    1 ...
3    0    0    0    0    1    0    0 ...
4    1    0    0    0    0    0    0 ... 
5    0    0    1    0    0    0    0 ...
6    0    0    0    1    0    0    0 ...
7    0    0    0    0    0    0    0 ...
[...]
其结果如下:

import pandas as pd

df = pd.DataFrame({'Day': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                    'Time': [11,15,9,15,17,10,20],
                    'Count': [100,150,150,150,180,60,50]})

df_dummies = pd.get_dummies(df.Day * df.Time)

print(df_dummies)
   Fri_9  Fri_15  Mon_9 Mon_15 Sat_9 Sat_15 Sun_9 ...
0    0    1    0    0    0    0    0 ...
1    0    0    0    0    0    1    0 ...
2    0    0    0    0    0    0    1 ...
3    0    0    0    0    1    0    0 ...
4    1    0    0    0    0    0    0 ... 
5    0    0    1    0    0    0    0 ...
6    0    0    0    1    0    0    0 ...
7    0    0    0    0    0    0    0 ...
[...]

有什么方法可以优雅地做到这一点吗

我相信需要将列与cast连接到
string
s:

df_dummies = pd.get_dummies(df.Day + '_' + df.Time.astype(str))

#df_dummies = pd.get_dummies(df.Day.str.cat(df.Time.astype(str), sep='_'))

print(df_dummies)
   Fri_17  Mon_11  Sat_10  Sun_20  Thu_15  Tue_15  Wed_9
0       0       1       0       0       0       0      0
1       0       0       0       0       0       1      0
2       0       0       0       0       0       0      1
3       0       0       0       0       1       0      0
4       1       0       0       0       0       0      0
5       0       0       1       0       0       0      0
6       0       0       0       1       0       0      0
我正试图建立一个线性回归模型来预测

从技术上讲,可以对元组进行虚拟:

>>> pd.get_dummies(df[['Day', 'Time']].apply(tuple, axis=1))

(Fri, 17)   (Mon, 11)   (Sat, 10)   (Sun, 20)   (Thu, 15)   (Tue, 15)   (Wed, 9)
0   0   1   0   0   0   0   0
1   0   0   0   0   0   1   0
2   0   0   0   0   0   0   1
3   0   0   0   0   1   0   0
4   1   0   0   0   0   0   0
5   0   0   1   0   0   0   0
6   0   0   0   1   0   0   0
...

然而,我认为这种方法在ML级别上不是最好的。这可能会使数据变得非常零碎,使回归者很难接受。如果你在交互之后,你可以考虑使用一个梯度提升决策树。我知道必须有一个非常简单的方法来做到这一点。这正是我在搜索的内容。你能解释一下为什么我会喜欢元组而不是字符串吗?正如在jezrael的解决方案中发布的那样?@Jeroen没有真正的原因-元组和下划线都是有效的方法。下划线的优点是它们是有效的python标识符,元组的优点是不需要拆分来获取日期和时间。您可以使用(并接受)任一答案。我的主要观点是关于如何使用这种分段的线性模型。数据的大小是多少?性能很重要?我大约有16000行。虚拟变量为每10分钟,一周中的每一天(因此144*7=1008个虚拟变量)。所以我想性能对于做一些计算是非常重要的。好吧,那么也试试我的答案?我想应该快一点。(但这主要取决于你的数据)这个方法也很有效,比Ami Tavory的方法稍微快一点。@Jeroen-如果没有问题,区别是什么?我很好奇,不同之处在于列名。现在我不确定是喜欢元组(@Ami)还是串接字符串。@Jeroen-当然,也许Ami现在离线了,但我想我可以得到答案以供评论。但在pandas中,我认为字符串更好,因为更好地使用它——但仍然取决于需要什么。我喜欢使用下划线,因为它可以创建有效的标识符。顺便说一句,如果你打算把这个输入回归器,我认为这个阶段的时间应该可以忽略不计。