【问题标题】:python split data frame columns into multiple rowspython将数据框列拆分为多行
【发布时间】:2016-05-15 23:03:20
【问题描述】:

我有一个这样的数据框:

--------------------------------------------------------------------
Product        ProductType     SKU                Size
--------------------------------------------------------------------
T-shirt        Top            [111,222,333,444]   ['XS','S','M','L']
Pant(Flared)   Bottoms        [555,666]           ['M','L']
Sweater        Top            None                None

我想要以下输出:

Product       ProductType        SKU        Size
T-shirt       Top                111        XS
T-shirt       Top                222        S
T-shirt       Top                333        M
T-shirt       Top                444        L
Pant(Flared)  Bottoms            555        M
Pant(Flared)  Bottoms            666        L
Sweater       Top                None       None

我尝试了以下代码:

s = df['SKU'].apply(Series,1).stack()
s.index = s.index.droplevel(-1)
s.name = 'SKU'
del df['SKU']
df = df.join(s)

r = df['Size'].apply(Series,1).stack()
r.index = r.index.droplevel(-1)
r.name = 'Size'
del df['Size']
df = df.join(r)

但这会分解成以下内容:

Product       ProductType   SKU             Size
T-shirt       Top           111             XS
T-shirt       Top           111             S
T-shirt       Top           111             M
T-shirt       Top           111             L
T-shirt       Top           222             XS
T-shirt       Top           222             S
T-shirt       Top           222             M
T-shirt       Top           222             L
T-shirt       Top           333             XS
T-shirt       Top           333             S
T-shirt       Top           333             M
T-shirt       Top           333             L
T-shirt       Top           444             XS
T-shirt       Top           444             S
T-shirt       Top           444             M
T-shirt       Top           444             L
Pant(Flared)  Bottoms       555             M
Pant(Flared)  Bottoms       555             L
Pant(Flared)  Bottoms       666             M
Pant(Flared)  Bottoms       666             L

请注意,为简单起见,我添加了两个将重复的列(Product、ProductType),但我有 5 个包含字符串的此类列。 我基本上想将 SKU 与每个产品的尺寸相关联。

有人可以帮忙吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是对错误开放的,因此请谨慎使用:

    将 Product 列转换为与其他列中的列表大小相同的列表集合(例如,列 SKU。如果 SKU 和 Size 中的列表长度不同,这将不起作用)

    df["Product"] = df["Product"].map(list) * df["SKU"].map(len)
    
    Out[184]: 
                        SKU           Size       Product
    0  [111, 222, 333, 444]  [XS, S, M, L]  [a, a, a, a]
    1            [555, 666]         [M, L]        [b, b]
    

    获取列的总和(它将扩展列表)并将其传递给带有 to_dict() 的数据框构造函数:

    pd.DataFrame(df.sum().to_dict())
    Out[185]: 
      Product  SKU Size
    0       a  111   XS
    1       a  222    S
    2       a  333    M
    3       a  444    L
    4       b  555    M
    5       b  666    L
    

    编辑

    对于多个列,您可以定义要重复的列:

    cols_to_be_repeated = ["Product", "ProductType"]
    

    将具有 None 值的行保存在另一个数据框中:

    na_df = df[pd.isnull(df["SKU"])].copy()
    

    从原始数据框中删除无:

    df.dropna(inplace = True)
    

    遍历这些列:

    for col in cols_to_be_repeated:
        df[col] = df[col].map(lambda x: [x]) * df["SKU"].map(len)
    

    并使用相同的方法:

    pd.concat([pd.DataFrame(df.sum().to_dict()), na_df])
    
            Product ProductType    SKU  Size
    0       T-shirt         Top  111.0    XS
    1       T-shirt         Top  222.0     S
    2       T-shirt         Top  333.0     M
    3       T-shirt         Top  444.0     L
    4  Pant(Flared)     Bottoms  555.0     M
    5  Pant(Flared)     Bottoms  666.0     L
    2       Sweater         Top    NaN  None
    

    处理原始数据帧的副本可能会更好。

    【讨论】:

    • 尺寸和 SKU 将始终是相同的尺寸。另外,如果我有除产品之外的多个列怎么办。例如:产品类型也需要与产品一起复制。
    • 另外..实际产品是一个字符串..所以当我将它转换为一个列表时,它会将它拆分为字符串中的所有多个字符..@ayhan
    • 假设数据是这样的:Product Name t-shirt Product Type Tops
    • @bjhav 您能否编辑问题以显示其他列和示例产品名称?在问题文本上而不是在 cmets 中更容易理解它。
    • 这个结果是为重复的列创建一个列表。输出结果时没有创建字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多