基于原始数据帧列创建新的数据帧



我有一个包含 10 列的 pandas 数据帧,其中一些是对象的 dtype。df看起来像这样:

date          ID       Cat        Chan       Num
2021-04-02     abc     Chrome     Direct       8
2021-04-02     xyz     Safari     Search       5
2021-04-02     pqr     Firefox    Direct       6
2021-04-02     dcf     Chrome       NA         1
2021-04-03     abc     Safari     Search       3
2021-04-03     xyz     Safari     Search       4
2021-04-03     pqr     NA         Direct       7
2021-04-03     dcf     Chrome     Direct       5

我需要编写一个循环,首先仅跟踪此 df 中的对象 dtype,然后为每列创建一个新的数据帧。这些新df应具有原始df中值的列头和用于返回每个日期每个值的计数的行。像这样:

first new df: df_cat:
date           Chrome       Safari       Firefox      NA
2021-04-02       2             1            1          0
2021-04-03       1             2            0          1
Second new df: df_chan:
date           Direct       Search         NA
2021-04-02       2             1            1          
2021-04-03       2             2            0

由于原始列中的"Num"列是int dtypes,因此我不希望此列使用新df

我尝试了如下方法,但它给出了一个错误:

属性

错误:"数据帧"对象没有属性"项":

mylist = list(df.select_dtypes(include=['object']).columns)   
for item in mylist:
category_item = pd.get_dummies(df.item)
category_item.head()

有人可以帮我吗?我对熊猫不是那么好,这听起来像是我解决的一个大问题。

你可以用"date"set_index;然后在每个对象dtype列上使用get_dummies+groupby+sum来获得所需的结果。

df0 = df0.set_index('date').fillna('NA')
out = {col: pd.get_dummies(df0[col]).groupby(level=0).sum() for col in df0.select_dtypes(include=[object]).columns}

输出:

ID:
abc  dcf  pqr  xyz
date                          
2021-04-02    1    1    1    1
2021-04-03    1    1    1    1 
Cat:
Chrome  Firefox  NA  Safari
date                                   
2021-04-02       2        1   0       1
2021-04-03       1        0   1       2 
Chan:
Direct  NA  Search
date                          
2021-04-02       2   1       1
2021-04-03       2   0       2 

我在这里使用字典将列名映射到新的数据帧。您也可以将它们存储在列表中。

最新更新