如何修复数据框拆分和分解方法无法正常工作?
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)
我有这个功能可以将 '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)