当前位置: 首页 > 知识库问答 >
问题:

以有效的方式附加基于多种条件的熊猫数据帧列(python)

柯景龙
2023-03-14

我有一个如下所示的数据框,我必须准备“目标列”

如果同一列下的两个单词之间有逗号,则必须按第2行所示标记两次。如果没有逗号但有空格,则必须将其视为同一个单词,即必须标记一次。另外,请注意顺序也很重要(第3行和第6行)。忽略任何内容(即没有单词,因此没有标签)

我已经使用了迭代(即使用iloc,for循环),但是它需要大量的时间,因为数据点超过200k,标签的数量也超过20个。我希望有一个有效的代码。请让我知道。此外,如果您想对问题/示例进行额外的澄清,请告诉我。

共有1个答案

益绯辞
2023-03-14

您可以使用数据帧。过滤带有标记文本的列,按数据帧重新整形。堆栈用于删除无,NaN,系列。str.split与系列。使用,分解重复值。然后用

#if none is not None (NoneType) convert to NaN

df = df.replace('none',np.nan)


df1 = (df.set_index('keyphrase', append=True)
         .filter(like='tag')
         .stack()
         .rename_axis(('idx','keyphrase','tags'))
         .str.split(', ')
         .explode()
         .reset_index(name='word')
         .rename_axis('i')
         )

#for correct ordering by splitted keyphrase by reindex
df1 = df1.assign(word = df1['word'].str.split()).explode('word')
df1['keyphrase'] = df1.groupby('idx')['keyphrase'].transform(lambda x: x.iat[0].split())
idx = df1.set_index(['idx','word'], append=True).index.droplevel(0)
df1 = df1.set_index(['idx','keyphrase'], append=True).reset_index(level=0).reindex(idx)
df1 = df1.groupby(['idx','i','tags'], sort=False)['word'].agg(' '.join).reset_index()
df1['word'] = '<' + df1['tags'] + '>' + df1['word']+ '<' + df1['tags'] + '>'
print (df1)
    idx   i  tags                       word
0     0   0  tag2          <tag2>word1<tag2>
1     0   1  tag3          <tag3>word2<tag3>
2     1   2  tag3          <tag3>word3<tag3>
3     1   3  tag3          <tag3>word4<tag3>
4     2   5  tag3          <tag3>word5<tag3>
5     2   4  tag1          <tag1>word6<tag1>
6     3   6  tag2    <tag2>word7 word8<tag2>
7     4   7  tag1          <tag1>word9<tag1>
8     4   8  tag3  <tag3>word10 word11<tag3>
9     5  10  tag2         <tag2>word12<tag2>
10    5   9  tag1         <tag1>word13<tag1>
11    5  11  tag3         <tag3>word14<tag3>
df['target'] = df1.groupby('idx')['word'].agg(''.join)
print (df)
   row             keyphrase    tag1         tag2           tag3  \
0    1           word1 word2     NaN        word1          word2   
1    2           word3 word4     NaN          NaN   word3, word4   
2    3           word5 word6   word6          NaN          word5   
3    4           word7 word8     NaN  word7 word8           None   
4    5   word9 word10 word11   word9          NaN  word10 word11   
5    6  word12 word13 word14  word13       word12         word14   

                                              target  
0                 <tag2>word1<tag2><tag3>word2<tag3>  
1                 <tag3>word3<tag3><tag3>word4<tag3>  
2                 <tag3>word5<tag3><tag1>word6<tag1>  
3                            <tag2>word7 word8<tag2>  
4         <tag1>word9<tag1><tag3>word10 word11<tag3>  
5  <tag2>word12<tag2><tag1>word13<tag1><tag3>word... 

 类似资料:
  • 我有这种熊猫。数据框。“a”、“b”是获得“x”和“y”时的条件。 我需要绘制关于相同条件的(x,y)结肠的折线图。预期结果图为: 当然,这个图像是由以下代码手动给出的: 我的问题是,当获得一个包含条件列x和y的数据帧时,如何动态地绘制如上所述的图。 列名是固定的。但是,条件列的值是动态更改的。因此,我不能使用10、20、100、200的值。 如果我有下面的“用a和b过滤”方法,我认为问题解决了:

  • 我有以下数据帧: 我需要删除等于的行。最有效的方法是什么?

  • 我有两个数据帧,其中一列名为。数据帧是从两名参与者同时录制的两个视频中提取的数据。由于跟踪失败,数据缺少一些帧(每个视频不同)。我想根据帧整数值取一个交点。 这里发布了一个类似的问题:熊猫——基于列条目的两个数据帧的交集,但接受的答案是连接,而不是交集。 已删除的行不在和 (我可以重置索引后,我完成处理) 我想首先得到两个数据帧的帧列的交集: 错误: 在获得两个数据帧中的帧索引后,我考虑执行以下操

  • 我想基于多个条件的评估创建一系列新的逻辑值。 举个例子 然而,我想返回一个逻辑序列,即。 如果可能的话,我想用熊猫的方法。

  • 我有两个熊猫数据框 步骤2:对于flag=1的行,AA_new将计算为var1(来自df2)*组“A”和val“AA”的df1的'cal1'值*组“A”和val“AA”的df1的'cal2'值,类似地,AB_new将计算为var1(来自df2)*组“A”和val“AB”的df1的'cal1'值*组“A”和val“AB”的df1的'cal2'值 我的预期输出如下所示: 以下基于其他stackflow

  • 我有这样一个数据帧: 我如何摆脱第四行,因为它有sq_resid的最大值?注意:最大值将从一个数据集更改到另一个数据集,所以仅仅删除第4行是不够的。 我已经尝试了一些方法,比如我可以删除像下面这样留下数据帧的最大值,但是无法删除整行。