Python 在dataframe中,如何基于一列中的数据设置其他列的值,而不使用循环?

Python 在dataframe中,如何基于一列中的数据设置其他列的值,而不使用循环?,python,pandas,dataframe,numpy,datetime,Python,Pandas,Dataframe,Numpy,Datetime,我正在尝试构建一个用于线性回归的数据框架。我想包括11个独立的“虚拟”变量,它们根据一年中的月份设置为1或0。在不偏离主题的情况下,我使用了11个变量,而不是12个,因为截距捕捉到了第12个月 我知道很多事情都可以通过pandas来完成,而无需在整个数据帧中循环,并且以这种方式进行操作通常比使用循环更快 那么,是否可以从我的日期列中获取月份,并基于该月份动态地将单独的列设置为1或0?还是我在问一个愚蠢的问题 编辑:我应该包括更多的信息。 数据帧的结构如下所示: 日期 sku 订购的单位 会议 转

我正在尝试构建一个用于线性回归的数据框架。我想包括11个独立的“虚拟”变量,它们根据一年中的月份设置为1或0。在不偏离主题的情况下,我使用了11个变量,而不是12个,因为截距捕捉到了第12个月

我知道很多事情都可以通过pandas来完成,而无需在整个数据帧中循环,并且以这种方式进行操作通常比使用循环更快

那么,是否可以从我的日期列中获取月份,并基于该月份动态地将单独的列设置为1或0?还是我在问一个愚蠢的问题

编辑:我应该包括更多的信息。 数据帧的结构如下所示:

日期 sku 订购的单位 会议 转化率 2020/01/30 abc123 20 200 0.1 2020/01/31 abc123 10 100 0.1 2020/02/01 abc123 15 60 0.25
我的方法是首先使用以下方法从每个月获取月数:

df['Date'].dt.month
然后与索引一起使用以获得计数的列表:

pd.crosstab(
df.index,
df[“日期”].dt.月
)
然后返回到DF on索引:

df=(
df.合并(pd.交叉表(
df.index,
df[“日期”].dt.月
),
左索引=真,
右(索引=真)
)
输出:

        Date     sku  units ordered  sessions  conversion rate  1  2
0 2020-01-30  abc123             20       200             0.10  1  0
1 2020-01-31  abc123             10       100             0.10  1  0
2 2020-02-01  abc123             15        60             0.25  0  1
        Date     sku  units ordered  sessions  conversion rate  January  February
0 2020-01-30  abc123             20       200             0.10        1         0
1 2020-01-31  abc123             10       100             0.10        1         0
2 2020-02-01  abc123             15        60             0.25        0         1
最后,使用映射器生成的列包括:

df=df.rename(列={month\u num:calendar.month\u name[month\u num]
对于范围(1,13)}内的月数

总而言之:

将熊猫作为pd导入
导入日历
df=pd.DataFrame(
{'Date':{0:'2020/01/30',1:'2020/01/31',2:'2020/02/01'},
'sku':{0:'abc123',1:'abc123',2:'abc123'},
'有序单位':{0:20,1:10,2:15},
“会话”:{0:200,1:100,2:60},
‘转换率’:{0:0.1,1:0.1,2:0.25})
df['Date']=df['Date'].astype('datetime64[ns]'))
df=(
df.合并(pd.交叉表(
df.index,
df[“日期”].dt.月
),
左索引=真,
右(索引=真)
)
df=df.rename(列={month\u num:calendar.month\u name[month\u num]
对于范围(1,13)}内的月数
打印(df.to_string())
输出:

        Date     sku  units ordered  sessions  conversion rate  1  2
0 2020-01-30  abc123             20       200             0.10  1  0
1 2020-01-31  abc123             10       100             0.10  1  0
2 2020-02-01  abc123             15        60             0.25  0  1
        Date     sku  units ordered  sessions  conversion rate  January  February
0 2020-01-30  abc123             20       200             0.10        1         0
1 2020-01-31  abc123             10       100             0.10        1         0
2 2020-02-01  abc123             15        60             0.25        0         1

“可能吗?”是的,有很多方法。如果您提供了一个关于数据集外观和所需结果集的最小示例,您就更有可能得到一个完整的答案,其中包含针对特定案例的代码。嘿,亨利,谢谢你的回答。我继续向OP添加了更多细节。我认为这澄清了最初的问题。后续问题。您的DF中是否有12月份的值?你说第12个月“被截获”,我假设这意味着DF不包含该月的值,但你的循环似乎过滤掉了12月。我只包括1月到11月。我把这个数据框输入一个线性回归公式,月份是自变量。回归的问题是,如果在所有12个月的每个月都包含一个变量,回归将失败,因为它无法解决截距问题。在这种情况下,当1月至11月的变量等于零时,考虑第12个月。编辑:为了清楚起见,我有一些行包含12月份的销售数据,但没有这个月的自变量。这太棒了。我知道必须有一种不需要循环的方法。这是一些直截了当的故事。