我正在做一些文本分析,并试图遍历一个数据框,该数据框由一列中的单词列表和其他列中的一些数值组成。我想将列表列中的所有单词拆分到不同的行上,并同时带来同一行中的值。我希望该代码可供与我共享的其他人使用,因此我编写了代码,以便他们仅在代码中更早地输入所需的列。
当我指定列名时,我设法遍历数据框,拆分单词并赋予值属性,但是当我尝试使循环动态化时,我似乎无法正确理解语法:
TokensTable = pd.DataFrame({'Token': [], 'Value1': [],'Value2': [],'Value3': []})
counter = 0
for index, row in metricsByToken2.iterrows(): #for each row in the dataframe with values and the token lists
for index2, token in enumerate(row[0]): #for each token in the list of tokens in each row
if token.isalpha(): #If the token doesnt contain punctuation then
token = token.lower() #lowercase the token
if token in stop_words: #if the token is a stop word then
del token #delete the token
else:
TokensTable.loc[counter] = [row[0][index2]] + [row[1]] + [row[2]] + [row[3]]
counter = counter + 1 #increase counter to move to the next row in new df
else:
del token
因此,如果存在带有其他列200,300,400的列表['A','B','C'],那么我希望将其拆分为3个单独的行,例如:'A',200,300,400然后是'B', 200,300,400和'C',200,300,400。
以上代码到目前为止对我有用,但是我手动指定了[Row [1] + [Row [2]等。每次我运行[row [0] [index2]]时代码,以便必须保留,但同一行上添加的其他列的数量将每次更改。所需的列数始终将始终达到len(TokensTable)-1,因此我需要以某种方式从0循环到len(TokensTable)-1。我想是这样,但到目前为止我还没有运气来解决这个问题,因此没有任何帮助非常感谢
示例输入:
╔══════════════════╦════════╦════════╦════════╗
║ Text ║ Value1 ║ Value2 ║ Value3 ║
╠══════════════════╬════════╬════════╬════════╣
║ ['A','B','C'] ║ 1 ║ 3 ║ 7 ║
║ ['A1','B1','C1'] ║ 2 ║ 4 ║ 8 ║
║ ['A2','B2','C2'] ║ 3 ║ 5 ║ 9 ║
╚══════════════════╩════════╩════════╩════════╝
示例输出:
╔═══════╦════════╦════════╦════════╗
║ Token ║ Value1 ║ Value2 ║ Value3 ║
╠═══════╬════════╬════════╬════════╣
║ A ║ 1 ║ 3 ║ 7 ║
║ B ║ 1 ║ 3 ║ 7 ║
║ C ║ 1 ║ 3 ║ 7 ║
║ A1 ║ 2 ║ 4 ║ 8 ║
║ B1 ║ 2 ║ 4 ║ 8 ║
║ C1 ║ 2 ║ 4 ║ 8 ║
║ A2 ║ 3 ║ 5 ║ 9 ║
║ B2 ║ 3 ║ 5 ║ 9 ║
║ C2 ║ 3 ║ 5 ║ 9 ║
╚═══════╩════════╩════════╩════════╝
答案 0 :(得分:0)
感谢@ HS-nebula链接,它使我找到了所需的答案。 最后,我随后使用循环来清理聚集的令牌,但为了取消嵌套,我使用了以下内容:
TokensTable = metricsByToken2.apply(lambda x: pd.Series(x['Token']),axis=1).stack().reset_index(level=1, drop=True)
TokensTable.name = 'Token'
TokensTable = metricsByToken2.drop('Token', axis=1).join(TokensTable)
TokensTable = TokensTable.reset_index(drop=True)