Разделить строку из заданного списка строк из столбца dand pandas - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть пандас, который выглядит как показано ниже.В нем около миллиона строк.

name = ['Jake','Matt', 'Henry']

0   A        
1 Jake Hill
2 Matt Dawn
3 Matt King
4 White Henry
5 Hyde Jake

Я хочу перебрать список и столбец df ['A'] и вернуть только первые имена.Например, окончательный фрейм данных должен выглядеть следующим образом.

0   A
1  Jake
2  Matt
3  Matt
4  Henry
5  Jake

Заранее спасибо.Я новичок в Python, так что до сих пор выясняю самый простой способ сделать это.

Ответы [ 7 ]

0 голосов
/ 20 ноября 2018

Попробуйте использовать:

A_final=A[0].str.split(' ',expand=True, n=1).str.get(0) A_final[0], ваша проблема решена.

0 голосов
/ 21 ноября 2018

Этот метод не будет одурачен фамилией, содержащей одну из строк имени, такой как "Matten" или "Jakes", и объединит имя и фамилию, если они оба найдены в списке имен, например, «Matt Henry» (показывает «MattHenry» в выходном кадре данных).

# split the name strings into columns as new dataframe
df1 = df.A.str.split(' ', expand=True)
# Keep the first names in the new dataframe and fill the rest with
# empty strings, then sum the df1 column string values to make a new array
names_result = np.where(df1.isin(name), df1, '').sum(axis=1)
# find the array indexes where no first names were found
no_match_idx = np.where(names_result == '')[0]
# fill the no first name index locations with original dataframe values
names_result[no_match_idx] = df.A.values[no_match_idx]
# make a dataframe using the results
df_out = pd.DataFrame(names_result, columns=['A'])

# to find names with a first and last name that are both found in the
# first names list:
# df_out['dups'] = df1.isin(name).sum(axis=1) > 1
0 голосов
/ 20 ноября 2018

У вас есть список имен для сопоставления и серия имен для проверки.Используйте здесь регулярное выражение с str.extract.

df.A.str.extract(r'({})'.format('|'.join(name)))

       0
0   Jake
1   Matt
2   Matt
3  Henry
4   Jake
0 голосов
/ 20 ноября 2018

В дополнение к более раннему редактированию, которое, как я понял, теперь вы хотите заменить на месте, что можно сделать с помощью понимания списка следующим образом, разбив столбец A Fist и выберите его первый индекс и перейдите к лямбде, используя apply метод.

Структура фрейма данных:

df
             A
0    Jake Hill
1    Matt Dawn
2    Matt King
3  Henry White
4    Jake Hyde

Ваш name Var ..

$ name
['Jake', 'Matt', 'Henry']

Ваш конечный желаемый набор данных:

Параметр n может использоваться для ограничения количества разбиений на выходе.

df['A'] = df['A'].str.split(n=1, expand=True)[0].apply(lambda x: x if x in name else ' '.join(x))

   print(df)
           A
    0   Jake
    1   Matt
    2   Matt
    3  Henry
    4   Jake

Это должно быть просто, если вы не нажали, чтобы брать имена из Var, и конечная цель - получить Имя из фрейма данных:

>>> df
             A
0    Jake Hill
1    Matt Dawn
2    Matt King
3  Henry White
4    Jake Hyde


>>> df['A'].str.split(n=1, expand=True)[0]
0     Jake
1     Matt
2     Matt
3    Henry
4     Jake
Name: 0, dtype: object

ИЛИ Если вы хотите заменить на месте колонку A ..

df['A'] = df['A'].str.split(n=1, expand=True)[0]
0 голосов
/ 20 ноября 2018
name = ['Jake','Matt', 'Henry']
df = pd.read_csv("file.csv")

#filling nan values in-case if it is there
df.fillna(0, inplace = True)
df["First Name"] = df.A.apply(lambda x: list(set(x.split(" ")) & set(name))[0]  if x != 0 else "Not Found")

Выход:

             A First Name
0    Jake Hill       Jake
1    Matt Dawn       Matt
2    Matt King       Matt
3  Henry White      Henry
4    Hyde Jake       Jake
0 голосов
/ 20 ноября 2018

Вам нужно:

first_name = ['Jake','Matt', 'Henry']

df = pd.DataFrame({'A': ['Jake Hill', 'Matt Dawn', 'Matt King', 'Henry White','Jake Hyde','Dwayne John']})

def func(x):
    for k in first_name:
        if k in x:
            return k 
    return x

df['A'] = df['A'].apply(lambda x: func(x))

Вывод:

            A
0           Jake
1           Matt
2           Matt
3          Henry
4           Jake
5    Dwayne John
0 голосов
/ 20 ноября 2018

Вот один из способов достижения этого:

first_name = ['Jake','Matt', 'Henry']

df = pd.DataFrame({'A': ['Jake Hill', 'Matt Dawn', 'Matt King', 'Henry White', 'Jake Hyde']})

df['B'] = df['A'].str.split().apply(lambda x: x[0] if x[0] in first_name else ' '.join(x))

и вы получите:

             A      B
0    Jake Hill   Jake
1    Matt Dawn   Matt
2    Matt King   Matt
3  Henry White  Henry
4    Jake Hyde   Jake
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...