如何将一个字母和点组合成一行

2024-05-15 00:13:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有两列的数据框。列是Word和Tag。df如下所示:

                     Word   Tag
0                  bentuk    A
1                   fisik    B 
2              masyarakat    C 
3                   serta    D  
4              kebudayaan    E
5                    yang    F
6              dihasilkan    G
7                       .    H
8                       ;    I
9                 William    O
10                      A    O
11                      .    B
12                Haviland   X

我想把一行中包含一个带有点.{}的字母合并到一行中。如果有一个单词meet dot,它将不会合并。因此,输出应如下所示:

0                  bentuk    A
1                   fisik    B 
2              masyarakat    C 
3                   serta    D  
4              kebudayaan    E
5                    yang    F
6              dihasilkan    G
7                       .    H
8                       ;    I
9                 William    O
10                     A.    O
11                Haviland   X

有什么想法吗?提前谢谢

注意:我尝试了@jezrael的解决方案,但输出是

0                  bentuk    A
1                   fisik    B 
2              masyarakat    C 
3                   serta    D
4                      A.    O
5              kebudayaan    E
6                    yang    F
7              dihasilkan    G
8                       .    H
9                       ;    I
10                 William    O
11                Haviland   X

结果不正常


Tags: 数据dftag字母单词wordyangwilliam
1条回答
网友
1楼 · 发布于 2024-05-15 00:13:35

我用匹配字母A-Za-z修改前面的解决方案,并在其后面加上.

m1 = df['Word'].str.contains("^[A-Za-z]{1}$") & df['Word'].shift(-1).eq('.')
m2 = df['Word'].eq('.') & df['Word'].shift().str.contains("^[A-Za-z]{1}$")

m = m1 | m2
g = (~m).cumsum().where(m)

m5 = g.map(g.value_counts()) == 2
g1 = g.where(m5, np.arange(len(df)) + .5)

df1 = (df.groupby(g1, as_index=False)
          .agg({'Word': ''.join, 'Tag' :'first'}))
print(df1)
          Word Tag
0       bentuk   A
1        fisik   B
2   masyarakat   C
3        serta   D
4   kebudayaan   E
5         yang   F
6   dihasilkan   G
7            .   H
8            ;   I
9      William   O
10          A.   O
11    Haviland   X

编辑:在查找问题后,有累积值移位,默认排序为groupby,所以更改了顺序。解决方案是将sort=False参数添加到groupby

df1 = (df.dropna()
        .groupby(g1, as_index=False, sort=False)
        .agg({'Word': ''.join, 'Tag' :'first'}))
print(df1.loc[4750:4770])
             Word       Tag
4750       dengan         O
4751  mempelajari         O
4752        aneka         O
4753        warna         O
4754            ,         O
4755       bentuk         O
4756        fisik         O
4757   masyarakat         O
4758        serta         O
4759   kebudayaan         O
4760         yang         O
4761   dihasilkan         O
4762            .         O
4763            ;         O
4764      William  B-PERSON
4765           A.  I-PERSON
4766     Haviland  I-PERSON
4767            :         O
4768  Antropologi         O
4769       adalah         O
4770        studi         O

相关问题 更多 >

    热门问题