pandas - Pandas - 根据另一列python的某些值,将一行中的单词拆分为多个基于行的单词

我有dataframe 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的2倍行(如id2和id4)拆分为相等的部分,以使这些行的countsOfWords列仅包含两个单词,但不会更改columnId和column3。df dataframe如下所示:


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



谁能帮助我?


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



时间: 原作者:

我们执行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


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



原作者:

你可以尝试此(将str.split ()与zip ()一起使用,然后使用.explode()):


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



原作者:

可以将值拆分为一个列表,然后用相等的2个元素块拆分它们。

然后检查元素个数


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



原作者:


tb = [['id1', 'hogedijk klarenbeek', 2016],


['id2', 'hogedijk klarenbeek zuidoost hogedijk klarenbeek zuidoost', 2012],


['id3', 'hogedijk klarenbeek', 2010],


['id4', 'artzuid zuidoost hogedijk klarenbeek zuidoost clouds hogedijk klarenbeek', 2019]]



COL_1 = 0


COL_2 = 1


COL_3 = 2


SPACE = ' '


new_tb = []


for line in tb:


 words = line[COL_2].split(SPACE)


 while len(words) != 0:


 new_line = [line[COL_1]]


 new_word_set = words.pop(0)


 new_word_set += SPACE + words.pop(0)


 new_line.append(new_word_set)


 new_line.append(line[COL_3])


 new_tb.append(new_line)


print(pd.DataFrame(new_tb))



原作者:
...