Pandas - 将 numpy 数组存储在数据框列中,这是函数的结果
Pandas - store numpy array in a dataframe column which is a result of function
我有一个 pandas 数据框,其中有一列 allTexts
,它为每一行存储一堆文本信息。我正在尝试应用一个自定义函数,该函数给定输入文本 returns 3 个值。然后我想将这 3 个输出值存储在一个新的数据框列中 - 理想情况下作为每一行的 numpy 数组。我使用 apply()
执行此操作,代码成功完成但实际上并没有更改值。
#stub for creating a dataframe
df = pd.DataFrame({'allText':['Hateful text. This is bad', 'Text about great stuff', ' ']})
#set a placeholder - just 3 zeros for each record
df['Sentiments'] = df['allText'].apply(lambda x: np.zeros(3))
#function definition. It is a textblob library function, which gives me back sentiment scores for each text
def getTextSentiments(text):
blob = TextBlob(text)
pos = 0
neg = 0
neutral = 0
count = 0
for sentence in blob.sentences:
sentiment = sentence.sentiment.polarity
if sentiment > 0.1:
pos +=1
elif sentiment > -0.1:
neutral +=1
else:
neg +=1
count+=1
if count == 0:
count = 1
return numpy.array([pos/count, neutral/count, neg/count])
#apply function only for non-empty texts and override 3 zeros in sentiments column with real 3 values
df[df["allText"]!=" "]['Sentiments'] = df[df["allText"]!=" "]["allText"].apply(getTextSentiments)
在这段代码没有任何错误地完成后,我的情绪列中的所有零的值仍然相同。
MVP 证明它即使是单条记录也不起作用:
df[df["allText"]!=" "].iloc[0]['Sentiments']
array([ 0., 0., 0.])
test = getTextSentiments(df[df["allText"]!=" "].iloc[0]['allText'])
test
Out[64]: (0.4166666666666667, 0.5, 0.08333333333333333)
df[df["allText"]!=" "].iloc[0]['Sentiments'] = test
df[df["allText"]!=" "].iloc[0]['Sentiments']
Out[75]: array([ 0., 0., 0.])
对我做错了什么有什么建议吗?
你能试试下面的方法吗?
df.Sentiments = df.apply(lambda x: x.Sentiments if x.allText ==' ' else getTextSentiments(x.allText), axis=1)
使用虚拟 getTextSentiments 函数进行测试:
df = pd.DataFrame({'allText':['Hateful text. This is bad', 'Text about great stuff', ' ']})
#set a placeholder - just 3 zeros for each record
df['Sentiments'] = df['allText'].apply(lambda x: np.zeros(3))
def getTextSentiments(text):
return (0.4166666666666667, 0.5, 0.08333333333333333)
df.Sentiments = df.apply(lambda x: x.Sentiments if x.allText ==' ' else getTextSentiments(x.allText), axis=1)
df
Out[181]:
allText Sentiments
Out[181]:
allText Sentiments
0 Hateful text. This is bad (0.4166666666666667, 0.5, 0.08333333333333333)
1 Text about great stuff (0.4166666666666667, 0.5, 0.08333333333333333)
2 [0.0, 0.0, 0.0]
我有一个 pandas 数据框,其中有一列 allTexts
,它为每一行存储一堆文本信息。我正在尝试应用一个自定义函数,该函数给定输入文本 returns 3 个值。然后我想将这 3 个输出值存储在一个新的数据框列中 - 理想情况下作为每一行的 numpy 数组。我使用 apply()
执行此操作,代码成功完成但实际上并没有更改值。
#stub for creating a dataframe
df = pd.DataFrame({'allText':['Hateful text. This is bad', 'Text about great stuff', ' ']})
#set a placeholder - just 3 zeros for each record
df['Sentiments'] = df['allText'].apply(lambda x: np.zeros(3))
#function definition. It is a textblob library function, which gives me back sentiment scores for each text
def getTextSentiments(text):
blob = TextBlob(text)
pos = 0
neg = 0
neutral = 0
count = 0
for sentence in blob.sentences:
sentiment = sentence.sentiment.polarity
if sentiment > 0.1:
pos +=1
elif sentiment > -0.1:
neutral +=1
else:
neg +=1
count+=1
if count == 0:
count = 1
return numpy.array([pos/count, neutral/count, neg/count])
#apply function only for non-empty texts and override 3 zeros in sentiments column with real 3 values
df[df["allText"]!=" "]['Sentiments'] = df[df["allText"]!=" "]["allText"].apply(getTextSentiments)
在这段代码没有任何错误地完成后,我的情绪列中的所有零的值仍然相同。
MVP 证明它即使是单条记录也不起作用:
df[df["allText"]!=" "].iloc[0]['Sentiments']
array([ 0., 0., 0.])
test = getTextSentiments(df[df["allText"]!=" "].iloc[0]['allText'])
test
Out[64]: (0.4166666666666667, 0.5, 0.08333333333333333)
df[df["allText"]!=" "].iloc[0]['Sentiments'] = test
df[df["allText"]!=" "].iloc[0]['Sentiments']
Out[75]: array([ 0., 0., 0.])
对我做错了什么有什么建议吗?
你能试试下面的方法吗?
df.Sentiments = df.apply(lambda x: x.Sentiments if x.allText ==' ' else getTextSentiments(x.allText), axis=1)
使用虚拟 getTextSentiments 函数进行测试:
df = pd.DataFrame({'allText':['Hateful text. This is bad', 'Text about great stuff', ' ']})
#set a placeholder - just 3 zeros for each record
df['Sentiments'] = df['allText'].apply(lambda x: np.zeros(3))
def getTextSentiments(text):
return (0.4166666666666667, 0.5, 0.08333333333333333)
df.Sentiments = df.apply(lambda x: x.Sentiments if x.allText ==' ' else getTextSentiments(x.allText), axis=1)
df
Out[181]:
allText Sentiments
Out[181]:
allText Sentiments
0 Hateful text. This is bad (0.4166666666666667, 0.5, 0.08333333333333333)
1 Text about great stuff (0.4166666666666667, 0.5, 0.08333333333333333)
2 [0.0, 0.0, 0.0]