微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

熊猫根据列条件拆分行 设置使用 findall 和 explode 的方法结果

如何解决熊猫根据列条件拆分行 设置使用 findall 和 explode 的方法结果

我有一个包含一些列的 Pandas 数据框,“input_text”列每行大约有 8K 个字。我的目的是将每一行分成更多行,每行包含来自原始行 input_text 的 500 个单词。 例如,如果我们使用 2 个单词而不是 500 个,则这一行:

a | b | c | d | input_text
1   2   3   4       'Hello this is text hello how r u'

会变成 4 行:

a | b | c | d | input_text
1   2   3   4       'Hello this'
a | b | c | d | input_text
1   2   3   4       'is text'
a | b | c | d | input_text
1   2   3   4       'hello how'
a | b | c | d | input_text
1   2   3   4       'r u'

但我需要这个来处理 500 字。

代码

import pandas as pd
df = pd.read_csv('data.csv')
# function

注意!我使用的数据框真的很大,所以速度在这里很重要。

解决方法

设置

print(df)

   a  b  c  d                        input_text
0  1  2  3  4  Hello this is text hello how r u

使用 findallexplode 的方法

df['input_text'] = df['input_text'].str.findall(r'((?:\S+\s?){1,2})(?:\s|$)')
df = df.explode('input_text')

正则表达式详情

  • ((?:\S+\s?){1,2}):第一个捕获组
    • (?:\S+\s?):非捕获组
      • \S+\s? : 匹配一个或多个非空白字符后跟零个或一个空格
      • {1,2}:在一次或两次之间匹配前一个标记
  • (?:\s|$) : 非捕获组
    • \s|$ : 匹配单个空格字符或断言行尾位置

online regex demo

结果

print(df)

   a  b  c  d  input_text
0  1  2  3  4  Hello this
0  1  2  3  4     is text
0  1  2  3  4   hello how
0  1  2  3  4         r u

注意:为了按 500 单词拆分,请将正则表达式模式中的 2 替换为 500

,

你能试试这个吗? 首先将单词拆分为列表并将其存储在列中。您可以将 number_to_split 更改为 500 以拆分为 500

number_to_split =2
def split_text(string):
    words = string.split()
    grouped_words = [' '.join(words[i: i + number_to_split]) for i in range(0,len(words),number_to_split)]
    return grouped_words

df['new_col'] = df[' input_text'].apply(split_text)

然后像这样为列表的每个值重复行?

df_new = df.new_col.apply(pd.Series).stack().rename('new').reset_index()
pd.merge(df_new,df,left_on='level_0',right_index=True,suffixes=(['','_old']))[df.columns]
,

试试:

def splitter(input_text,n=2):
  values = input_text.split()
  return [values[i:i+n] for i in range(0,len(values),n)]

df['input_text'] = df['input_text'].astype(str).apply(lambda x:splitter(x))
df = df.explode('input_text')
df['input_text'] = df['input_text'].apply(lambda x: ' '.join(x))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?