Для каждой строки моего фрейма данных мне необходимо:
- получить последнее слово из списка, разделенного запятой;
- Проверить, является ли это слово последним словомдругого списка в серии;
- Если нет: переберите список с конца, чтобы получить первый, соответствующий этому условию.
В качестве примера я взял серию, содержащую списки случайных символов
Чтобы обновить «последний» столбец, я пытался использовать функцию, содержащую цикл while, но я не могу понять, как это сделать. Каковы лучшие методы для достижения этой цели?
In[5]:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'List': ['6,f,e,w,m,i,n', '7,m,2,n,3,k,i', 'h,e,a,l,5,v,8', 'c,t,i,v,t,n,1', 'o,q,k,2,p', '6,b,p,n,7,1,k', '3,u,v,q,e,1,z,w', 'm,h,o,b,8,6,n'
]})
In[6]:
df
Out[6]:
List
0 6,f,e,w,m,i,n
1 7,m,2,n,3,k,i
2 h,e,a,l,5,v,8
3 c,t,i,v,t,n,1
4 o,q,k,2,p
5 6,b,p,n,7,1,k
6 3,u,v,q,e,1,z,w
7 m,h,o,b,8,6,n
In[14]:
df['Last'] = df['List'].str.split(',').str[-1]
df['List-length'] = df['List'].str.split(",").apply(len)
df['frequency'] = df.groupby('Last')['Last'].transform('count'
df
Out[14]:
List Last List-length frequency
0 6,f,e,w,m,i,n n 7 2
1 7,m,2,n,3,k,i i 7 1
2 h,e,a,l,5,v,8 8 7 1
3 c,t,i,v,t,n,1 1 7 1
4 o,q,k,2,p p 5 1
5 6,b,p,n,7,1,k k 7 1
6 3,u,v,q,e,1,z,w w 8 1
7 m,h,o,b,8,6,n n 7 2
In[1]:
def avoid_singles(d):
index = -2
remaining_items = d['List-length']
number_of_singles = d.loc[d['frequency'] == 1].size
while number_of_singles >= 1:
d['Last'] = np.where((df['frequency'] == 1) & (d['List-length'] >= abs(index)), d['List'].str.split(",").str[index], d['Last'])
df['frequency'] = df.groupby('Last')['Last'].transform('count')
number_of_singles = d.loc[d['frequency'] == 1].size
index += -1
avoid_singles(df)
И ожидаемый Last
столбец:
Last
0 n
1 k
2 h
3 n
4 k
5 k
6 3
7 n