我有一个包含 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
我在这里使用字典将列名映射到新的数据帧。您也可以将它们存储在列表中。