如何将数字合并为一行

3

我有一个包含两列的数据框。这两列分别是“Word”和“Tag”。数据框如下所示:

                     Word   Tag
0                     DNA   O
1                       ,   O
2                  adalah   O
3                       )   X
4                       ,   Y
5                  ikatan   P
6                      10   O
7                       ,   O
8                       4   Q
9                pasangan   Q
10                   abad   A
11                     20   B
12                      ,   C
13              bersamaan   D

我希望合并一些行,这些行包含带逗号 , 的数字 数字+,+数字 到一行中。输出应该如下所示:
                     Word   Tag
0                     DNA   O
1                       ,   O
2                  adalah   O
3                       )   X
4                       ,   Y
5                  ikatan   P
6                    10,4   O
7                pasangan   Q
8                    abad   A
9                      20   B
10                      ,   C
11              bersamaan   D

有什么想法吗?提前感谢。

我已经尝试过:

coma = df['Word'].shift().ne(',').mul(df['Word'].ne(',')).cumsum()
new_df = df.groupby(coma, as_index=False).agg({'Word' : ''.join, 'Tag' : 'first'})
print(new_df)

但它也会组合单词和逗号,而我只想组合数字和逗号。

1
请提供您尝试编写的一些代码以及遇到的问题。 - Shivam Jha
你想所有数字/逗号合并成一行,还是只合并连续的数字/逗号所在行? - Derek O
1
最好在创建数据框之前修改数据。 - deadshot
@ShivamJha 我已经放置了代码。 - winnie
@DerekO 只有连续的带有数字/逗号/数字的行才会被合并。 - winnie
1个回答

2

一种方法是通过测试数字的前后来识别值,,创建组并聚合joinfirst

m1 = df['Word'].str.isnumeric() & df['Word'].shift(-1).eq(',')
m2 = df['Word'].eq(',') & df['Word'].shift().str.isnumeric()

m3 = df['Word'].str.isnumeric() & df['Word'].shift().eq(',')
m4 = df['Word'].eq(',') & df['Word'].shift(-1).str.isnumeric()

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

m5 = g.map(g.value_counts()) == 3
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         DNA   O
1           ,   O
2      adalah   O
3           )   X
4           ,   Y
5      ikatan   P
6        10,4   O
7    pasangan   Q
8        abad   A
9          20   B
10          ,   C
11  bersamaan   D

从索引0开始的单词DNA已经消失了。 - winnie
@winnie - 你可以使用.shift(fill_value=-1)代替.shift()吗? - jezrael
谢谢,问题解决了!但是还有一个问题,如果数字后面有一个单词,它也会与数字结合在一起,就像我在问题描述中所描述的那样,我已经进行了编辑。 - winnie
实际上我只想合并number+,+number,而不是所有的number+, - winnie
@winnie - 现在可以测试吗?增加了连续三个值 数字,数字 的条件。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接