Pandas 基于$symbol将熊猫中的行拆分为多行

Pandas 基于$symbol将熊猫中的行拆分为多行,pandas,dataframe,pandas-groupby,Pandas,Dataframe,Pandas Groupby,我知道这个问题已经被问了很多次了,但在把它标记为重复之前,我发现的答案似乎都不起作用。我有一个如下形式的数据框: category | description ------------------------------ puppy dog$pup crappy cat$pet squeeky animal fluffy dog$pet 我

我知道这个问题已经被问了很多次了,但在把它标记为重复之前,我发现的答案似乎都不起作用。我有一个如下形式的数据框:

   category     |     description
   ------------------------------
    puppy              dog$pup
    crappy             cat$pet
    squeeky            animal
    fluffy             dog$pet
我想通过
$
符号将
description
列拆分为多行,并获得如下内容:

   category     |     description
   ------------------------------
    puppy              dog
    puppy              pup
    crappy             cat
    crappy             pet
    squeeky            animal
    fluffy             dog
    fluffy             pet
很抱歉这个愚蠢的例子,但我希望它能说明问题所在。我最后尝试的是:

new_df = pd.concat([pd.Series(row['category'], row['description'].split('$'))              
                    for _, row in old_df.iterrows()]).reset_index()
但这带来了一个:

AttributeError: 'float' object has no attribute 'split'.

我认为缺少值会有问题,因此更好的方法是使用,然后对于新行(适用于0.25+):


我认为缺少值会有问题,因此更好的方法是使用,然后对于新行(适用于0.25+):


对于pandas 0.25之前的答案,这里的一种方法是使用
apply
将一列拆分为两列,然后使用
melt
将数据重新组织到所需的结构中

import pandas as pd
data = [{ "category": "puppy", "description": "dog$pup"},
 { "category": "crappy", "description": "cat$pet"},
 { "category": "squeeky", "description": "animal"},
 { "category": "fluffy", "description": "dog$pet"},
]

data_df = pd.DataFrame(data)
data_df["one"], data_df["two"] = zip(*[r[0:2] for r in data_df['description'].apply(lambda x: x.split("$")+ [None] ) ])

data_df[['category','one','two']].melt(id_vars="category")[['category','variable']].sort_values(by=["category", "variable"])

对于0.25之前的答案,这里的一种方法是应用
将一列拆分为两列,然后使用
熔化
将数据重新组织到所需的结构中

import pandas as pd
data = [{ "category": "puppy", "description": "dog$pup"},
 { "category": "crappy", "description": "cat$pet"},
 { "category": "squeeky", "description": "animal"},
 { "category": "fluffy", "description": "dog$pet"},
]

data_df = pd.DataFrame(data)
data_df["one"], data_df["two"] = zip(*[r[0:2] for r in data_df['description'].apply(lambda x: x.split("$")+ [None] ) ])

data_df[['category','one','two']].melt(id_vars="category")[['category','variable']].sort_values(by=["category", "variable"])