【问题标题】:Attaching pandas dataframe's column based on multiple conditions in an efficient way (python)以有效的方式基于多个条件附加熊猫数据框的列(python)
【发布时间】:2022-01-10 18:24:38
【问题描述】:

我有一个如下图的数据框,我要准备“目标列”

row keyphrase tag1 tag2 tag3 target column (not given, to be prepared)
1 word1 word2 none word1 word2 <tag2>word1<tag2> <tag3>word2<tag3>
2 word3 word4 none none word3, word4 <tag3>word3<tag3> <tag3>word4<tag3> (there is a comma so different tag)
3 word5 word6 word6 none word5 <tag3>word5<tag3> <tag1>word6<tag1>
4 word7 word8 none word7 word8 none <tag2>word7 word8<tag2> (since there is not comma, it is a same word)
5 word9 word10 word11 word9 none word10 word11 <tag1>word9<tag1> <tag3>word10 word11<tag3>
6 word12 word13 word14 word13 word12 word14 <tag2>word12<tag2> <tag1>word13<tag1> <tag3>word14<tag3>

如果同一列下的两个单词之间有逗号,则必须将其标记两次,如第 2 行所示。如果没有逗号而是空格,则必须将其视为同一个单词,即,它必须标记一次。另外,请注意订单也很重要(第 3 行和第 6 行)。无视(即没有词所以没有标签)

我已经完成了使用迭代(即使用 iloc、for 循环),但是由于数据点超过 200k 并且标签数量也超过 20,因此需要大量时间。我希望有一个高效的代码。请告诉我。另外,如果您想更清楚地了解问题/示例,请告诉我。

【问题讨论】:

  • 请不要在这里使用印度语。世界其他地方不会用“lacs”来衡量任何东西,因此人们不会理解你。

标签: python pandas


【解决方案1】:

您可以将DataFrame.filter 用于带有tag 文本的列,通过DataFrame.stack 重塑以删除None, NaNSeries.str.splitSeries.explode 用于带有, 的重复值。然后用&lt;&gt; 连接列:

#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... 

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 2022-01-02
    • 2020-10-14
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多