Как заменить значение в исходном кадре данных при циклическом просмотре его строк? - PullRequest
0 голосов
/ 31 марта 2020

Я знаю, что это плохо для l oop через строки в df, но у меня есть столбец списков из пары сотен строк, в котором мне нужно изменить каждый элемент в списке. Мне трудно использовать .str.replace () /. Strip () таким образом, чтобы иметь дело со всеми лишними пробелами и т. Д. c. Входные данные:

import pandas as pd

input_19 = [{'name':'Hector', 'team_position':'forward', 'player_traits':'Finesse Shot, Speed Dribbler (CPU AI Only)'}, {'name':'Bysim', 'team_position':'forward', 'player_traits':'Long Shot Taker (CPU AI Only)'}, {'name':'Nicolas', 'team_position':'defender', 'player_traits':'Beat Offside Trap, Finesse Shot'}]

input_20 = [{'name':'Johann', 'team_position':'gk', 'player_traits':'GK Long Throw'}, {'name':'Winston', 'team_position':'defender', 'player_traits':'Dives Into Tackles (CPU AI Only)'}, {'name':'Petr', 'team_position':'forward', 'player_traits':'Flair, Long Shot Taker (CPU AI Only)'}]

df_19 = pd.DataFrame(input_19)
df_20 = pd.DataFrame(input_20)

выходные данные:

df_19:

    name     player_traits                               team_position
0   Hector   Finesse Shot, Speed Dribbler (CPU AI Only)  forward
1   Bysim    Long Shot Taker (CPU AI Only)               forward
2   Nicolas  Beat Offside Trap , Finesse Shot            defender

df_20:

    name     player_traits                               team_position
0   Johann   GK Long Throw                               gk
1   Winston  Dives Into Tackles (CPU AI Only)            defender
2   Petr     Flair,  Long Shot Taker (CPU AI Only)       forward

Столбец 'player_traits' в обе DFS нуждаются в модификации строки, как указано выше, поэтому я могу посчитать их частоту. Я хотел бы изменить их в исходном df (то есть по году), чтобы я мог создавать новые dfs путем фильтрации с помощью 'team_position' и использовать Counter, чтобы найти итоги каждой черты / элемента. Это код, который у меня есть, но я не уверен, как назначить новый 'temp_list' соответствующему месту в исходном df, так как .lo c в сочетании с .replace () изменяет фрагмент кадра данных, и. replace () для dfs принимает только строковые аргументы:

df_list = [df_19, df_20]

for df in df_list:
    for lst,i in zip(df['player_traits'].values, range(len(df['player_traits'].values))):
        temp_list = []
        if type(lst) != float:
            lst = lst.replace('(CPU AI Only)',"")
            lst = lst.split(",")
            for x in lst:
                x = x.strip()
                temp_list.append(x)
         # df[location of original value in original df] = temp_list
         # something like:
         # df[i, 'player_traits'] = temp_list

Как мне завершить этот код, который позволяет мне изменять исходное значение df с помощью измененного списка?

1 Ответ

1 голос
/ 31 марта 2020

Сначала создайте функцию, которая получает строку, изменяет ее и возвращает ваш список, а затем использует его с .apply() без l oop.

df['player_traits'] = df['player_traits'].apply(my_function)

Рабочий пример

import pandas as pd

# --- function ---

def my_function(lst):
    temp_list = []

    if type(lst) != float:
        lst = lst.replace('(CPU AI Only)',"")
        lst = lst.split(",")
        for x in lst:
            x = x.strip()
            temp_list.append(x)

    return temp_list

# --- main ---

input_19 = [{'name':'Hector', 'team_position':'forward', 'player_traits':'Finesse Shot, Speed Dribbler (CPU AI Only)'}, {'name':'Bysim', 'team_position':'forward', 'player_traits':'Long Shot Taker (CPU AI Only)'}, {'name':'Nicolas', 'team_position':'defender', 'player_traits':'Beat Offside Trap, Finesse Shot'}]
input_20 = [{'name':'Johann', 'team_position':'gk', 'player_traits':'GK Long Throw'}, {'name':'Winston', 'team_position':'defender', 'player_traits':'Dives Into Tackles (CPU AI Only)'}, {'name':'Petr', 'team_position':'forward', 'player_traits':'Flair, Long Shot Taker (CPU AI Only)'}]

df_19 = pd.DataFrame(input_19)
df_20 = pd.DataFrame(input_20)

df_list = [df_19, df_20]

for df in df_list:
    df['player_traits'] = df['player_traits'].apply(my_function)

print(df_19)
print(df_20)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...