如何修复数据框拆分和分解方法无法正常工作?

How to fix dataframe split and explode methods not working correctly?

我有这个功能可以将 'text' 列拆分为每个名为 'emotion' 的列。然而,这对预制数据框可以正常工作,但不适用于大数据框。因为在应用该函数时,它会创建另一列,其中包含 'text' 列的列表。

def splitting_rows(df, subset, subset_explode, split_value='\s+'):
    '''
    Creates new rows splitting the subset targeted.
    Transform each element of a list-like to a row, replicating index values 

    :param df: dataframe
    :param subset: target column to be splitted
    :param subset_explode: the subset to transform each element of a list-like to a row, replicating index values 
    :param split_value: Value to split. 
        # split('\s') is almost always wrong because it creates empty strings if there is more than one space separator,
        # use split('\s+) or simple split()
    :return: splitted dataset with new rows
    '''
    return df.assign(text=df[subset].str.split(split_value)).explode(subset_explode) 

正确输出示例:

# DATAFRAME INPUT
df = pd.DataFrame({
    'emotion': ['joy', 'fear', 'sadness'],
    'text': ['falling love', 'involved traffic accident', 'lost person']
})

# EXPECTED OUTPUT                                                                      
df_result = pd.DataFrame({
    'emotion': ['joy', 'joy', 'fear', 'fear', 'fear', 'fear' 'sadness', 'sadness', 'sadness'],
    'text': ['falling', 'love', 'involved', 'traffic', 'accident', 'lost', 'person', 'meant']
})

# This will give the correct ouptut
splitting_rows(df, subset='text', subset_explode='text')

dataframe 当前的问题

    Emotion Text                                                text
0   joy     period falling love time met especially met lo...   [period, falling, love, time, met, lo...
1   fear    involved traffic accident                           [involved, traffic, accident]
2   anger   driving home several days hard work motorist a...   [driving, home, several, days, hard, work, mot...
3   sadness lost person meant                                   [lost, person, meant]

我试图重新创建数据框,将每一列附加到一个列表,并将每个列表附加到一个新的数据框(没有 nan 值)以获得类似于第一个工作示例的内容,但它是相同的。

我正在使用 this dataframe

我首先拆分数据并扩展列,然后将扩展列与原始列连接起来,这样我就可以连接情感变量:

df_expand = df['text'].str.split(' ', expand=True)
df_merge = pd.concat([df, df_expand], axis=1).drop('text', axis=1)

之后,我将变量的名称放入列表中并删除了情绪,这样我只有扩展列的名称:

lc = list(df_merge.columns)
lc.remove('emotion')

然后我使用 melt 对扩展数据集的值进行反透视

df_melt = pd.melt(df_merge, id_vars=['emotion'], value_vars=lc).drop('variable', axis=1)

删除空值并对值进行排序以获得更清晰的视图

df_melt = df_melt[df_melt['value'].notnull()]
df_melt.sort_values('emotion')

这是我得到的

问题来自 assign 方法中的 text 命名参数。命名参数指的是列名。在您的数据框中,您有 text,而在在线数据框中,它是 Text。 正确的方法是根据 subset 参数的值在 apply 中动态构建名称参数。

将您的 return 语句替换为以下语句:

return df.assign(**{subset:df[subset].str.split(split_value)}).explode(subset_explode)