根据另一列的特定值将一行中的单词拆分为几行

2024-10-01 19:32:49 发布

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

我有这个数据帧df

columnId     column2                                                                  column3    countsOfWord
id1          hogedijk klarenbeek                                                       2016        2
id2          hogedijk klarenbeek zuidoost hogedijk klarenbeek zuidoost                 2012        6
id3          zuidoost clouds                                                           2010        2
id4          artzuid zuidoost hogedijk klarenbeek zuidoost clouds hogedijk klarenbeek  2019        8

我迫切需要将countsOfWords上面的行(如id2id4拆分为相等的部分),以便这些行的countsOfWords列只包含两个单词,而不改变列ID第3列。我的df数据帧如下所示:

columnId     column2                                                                  column3    countsOfWord
id1          hogedijk klarenbeek                                                       2016        2
id2          hogedijk klarenbeek                                                       2012        2
id2          zuidoost hogedijk                                                         2012        2
id2          klarenbeek zuidoost                                                       2012        2
id3          zuidoost clouds                                                           2010        2
id4          artzuid zuidoost                                                          2019        2
id4          hogedijk klarenbeek                                                       2019        2
id4          zuidoost clouds                                                           2019        2
id4          hogedijk klarenbeek                                                       2019        2

有人能帮我吗

我尝试了这段代码,但它不会自动为countsOfWords以上两次

df['column2'].iloc[1][0:len(df['column2'].iloc[0])//2]

Tags: 数据dfid3id2cloudsid1column2id4
3条回答

我们可以将您的值拆分为一个列表,然后将它们拆分为两个元素的相等块

然后我们检查元素数> 2explode这些行的位置:

splitted = df['column2'].str.split()
lists = splitted.apply(lambda lst: [lst[i::len(lst)//2] for i in range(len(lst)//2)])
df['column2'] = np.where(splitted.str.len().gt(2), lists, df['column2'])

dfn = df.explode('column2')

dfn['column2'] = np.where(
    dfn['column2'].apply(type).eq(list), 
    dfn['column2'].str.join(', '), 
    dfn['column2']
)

dfn['countsOfWord'] = dfn['column2'].str.split().str.len()
  columnId                 column2  column3  countsOfWord
0      id1     hogedijk klarenbeek     2016             2
1      id2      hogedijk, hogedijk     2012             2
1      id2  klarenbeek, klarenbeek     2012             2
1      id2      zuidoost, zuidoost     2012             2
2      id3         zuidoost clouds     2010             2
3      id4       artzuid, zuidoost     2019             2
3      id4        zuidoost, clouds     2019             2
3      id4      hogedijk, hogedijk     2019             2
3      id4  klarenbeek, klarenbeek     2019             2

您可以尝试以下方法(使用str.split()zip(),然后使用^{}):

df = df.assign(
        column2=df['column2'].apply(lambda x: [i + ' ' + j for i, j in zip(x.split()[::2],x.split()[1::2])])
    ).explode('column2')
df['countsOfWord'] = df['column2'].apply(lambda x: len(x.split()))
print(df)

印刷品:

  columnId              column2  column3  countsOfWord
0      id1  hogedijk klarenbeek     2016             2
1      id2  hogedijk klarenbeek     2012             2
1      id2    zuidoost hogedijk     2012             2
1      id2  klarenbeek zuidoost     2012             2
2      id3      zuidoost clouds     2010             2
3      id4     artzuid zuidoost     2019             2
3      id4  hogedijk klarenbeek     2019             2
3      id4      zuidoost clouds     2019             2
3      id4  hogedijk klarenbeek     2019             2

IIUC我们做explode然后cumcount将组拆分为子组

s=df.assign(column2=df.column2.str.split(' ')).explode('column2')

s=s.groupby([s.columnId,s.groupby('columnId').cumcount()//2]).\
        agg({'columnId':'first','column2':' '.join,'column3':'first','countsOfWord':'first'})
s=s.assign(countsOfWord=2).reset_index(drop=True)
s
  columnId              column2  column3  countsOfWord
0      id1  hogedijk klarenbeek     2016             2
1      id2  hogedijk klarenbeek     2012             2
2      id2    zuidoost hogedijk     2012             2
3      id2  klarenbeek zuidoost     2012             2
4      id3      zuidoost clouds     2010             2
5      id4     artzuid zuidoost     2019             2
6      id4  hogedijk klarenbeek     2019             2
7      id4      zuidoost clouds     2019             2
8      id4  hogedijk klarenbeek     2019             2

findall+explode

df.assign(column2=df.column2.str.replace(' ','-').str.findall("-".join(["[^-]+"] * 2))).explode('column2')
  columnId              column2  column3  countsOfWord
0      id1  hogedijk-klarenbeek     2016             2
1      id2  hogedijk-klarenbeek     2012             6
1      id2    zuidoost-hogedijk     2012             6
1      id2  klarenbeek-zuidoost     2012             6
2      id3      zuidoost-clouds     2010             2
3      id4     artzuid-zuidoost     2019             8
3      id4  hogedijk-klarenbeek     2019             8
3      id4      zuidoost-clouds     2019             8
3      id4  hogedijk-klarenbeek     2019             8

相关问题 更多 >

    热门问题