【发布时间】:2019-11-21 13:55:57
【问题描述】:
所以,这是我正在使用的数据集的一个示例 (link here)
brand model column1 column2 column3 category sub category value
Dell a aa bb cat1 sc1 aaa
Dell a aa bb cat1 sc2 bbb
Dell a aa cc cat2 sc1 ccc
Dell b aa bb cat1 sc1 ddd
Dell b aa bb cat2 sc1 eee
Dell b aa bb cc cat2 fff
Asus c aa cc bb cat1 sc1 ggg
Asus c aa cc bb cat1 hhh
Asus c aa cat1 sc2 iii
Asus d aa cc bb cat1 sc1 jjj
Asus d aa bb bb cat1 sc2 kkk
Asus d aa bb bb cat1 sc3 lll
我首先需要做的是根据品牌、型号、column1-3 分开独特的模型,我这样做:
import pandas as pd
df = pd.read_csv("abhorrent.csv")
noDupes = df[["brand", "model name", "column1", "column2", "column3"]].drop_duplicates().copy()
返回一个像这样的表:
brand model column1 column2 column3
Dell a aa bb
Dell a aa cc
Dell b aa bb
Dell b aa bb cc
Asus c aa cc bb
Asus c aa
Asus d aa cc bb
Asus d aa bb bb
但是,我需要根据类别、子类别和值创建列,并分配它们的值。
列名是类别和子类别的连接,我需要在其中放入这些对的值:
cat1_sc1
cat1_sc2
cat1_sc3
cat1_blank
cat2_sc1
cat2_blank
这些列不需要自动生成,我可以硬编码它们。
问题是我不知道如何根据非唯一数据框填充这些列中的值。
我正在寻找的最终结果是这样的:
brand model column1 column2 column3 cat1_sc1 cat1_sc2 cat1_sc3 cat1_blank cat2_sc1 cat2_blank
Dell a aa bb aaa bbb
Dell a aa cc ccc
Dell b aa bb ddd eee
Dell b aa bb cc fff
Asus c aa cc bb ggg hhh
Asus c aa iii
Asus d aa cc bb jjj
Asus d aa bb bb kkk lll
我能够在我的解决方案最初开发的 PostrgreSQL 中执行此操作,对每个预定义列使用一个 UPDATE。大致如下:
#fill the cat1_sc1 column
UPDATE transposed_table
SET cat1_sc1 = subquery.value
FROM
(SELECT ... FROM ... WHERE category = 'cat1' AND sub_category = 'sc1') subquery
WHERE brand = subquery.brand AND model = subquery.model etc
编辑:我的实际 CSV 有接近 50 万行
【问题讨论】:
-
你熟悉 pandas DataFrames 的pivot 功能吗?例如。
df.pivot(columns='category') -
@Antihead 所以我一直在研究枢轴函数,它看起来不太好。我在聚合方面遇到问题。似乎默认情况下 pivot_table 需要一个数字类型。当我只使用枢轴时,它表示传递值的长度 i 12,索引意味着 5。
标签: python pandas pandas-groupby transpose