【问题标题】:How to combine one letter and dot into a single row如何将一个字母和一个点组合成一行
【发布时间】:2020-12-26 15:36:54
【问题描述】:

我有一个包含两列的数据框。列是 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

我想将包含一个带有点 . letter+. 的字母的行合并到一行。如果有一个单词 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

结果乱码

【问题讨论】:

    标签: python pandas numpy dataframe merge


    【解决方案1】:

    我用匹配字母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
    

    编辑:查找问题后,累积值发生偏移,pandas 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
    

    【讨论】:

    • 你能解释一下^[A-Za-z]{1}$吗?
    • @winnie - 当然 - ^ 用于字符串的开头,[A-Za-z] 用于匹配字母 ABCD...Zabcd...z{1} 仅用于 1 个值,$ 用于字符串结尾
    • aah 我明白了,无论如何,您的代码会使结果乱序,正如我在问题中解释的那样
    • @winnie - 数据保密吗?
    • @winnie - 是的,如果检查我的个人资料并运行代码,请收到我的电子邮件。
    猜你喜欢
    • 2021-02-01
    • 2014-06-22
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多