Допустим, у меня есть этот фрейм данных:

Name = ['Lolo', 'Mike', 'Tobias','Luke','Sam']
Age = [19, 34, 13, 45, 52]
Info_1 = ['Tall', 'Large', 'Small', 'Small','']
Info_2 = ['New York', 'Paris', 'Lisbon', '', 'Berlin']
Info_3 = ['Tall', 'Paris', 'Hi', 'Small', 'Thanks']
Data = [123,268,76,909,87]
Sex = ['F', 'M', 'M','M','M']

df = pd.DataFrame({'Name' : Name, 'Age' : Age, 'Info_1' : Info_1, 'Info_2' : Info_2, 'Info_3' : Info_3, 'Data' : Data, 'Sex' : Sex})

print(df)

     Name  Age Info_1    Info_2  Info_3  Data Sex
0    Lolo   19   Tall  New York    Tall   123   F
1    Mike   34  Large     Paris   Paris   268   M
2  Tobias   13  Small    Lisbon      Hi    76   M
3    Luke   45  Small             Small   909   M
4     Sam   52           Berlin  Thanks    87   M

Я хочу объединить данные четырех столбцов этого фрейма данных: Info_1, Info_2, Info_3, Data. Я хочу объединить их без дублирования данных для каждой строки. Это означает, что для строки «0» я не хочу, чтобы «Высокий» было дважды. Итак, в конце хотелось бы получить что-то вроде этого:

     Name  Age                Info Sex
0    Lolo   19   Tall New York 123   F
1    Mike   34     Large Paris 268   M
2  Tobias   13  Small Lisbon Hi 76   M
3    Luke   45           Small 909   M
4     Sam   52    Berlin Thanks 87   M

Я пробовал эту функцию для объединения данных:

di['period'] = df[['Info_1', 'Info_2', 'Info_3' 'Data']].agg('-'.join, axis=1)

Однако я получаю сообщение об ошибке, потому что ожидает строку. Как мне объединить данные столбца «Данные»? И как я могу проверить, что не создаю дубликаты

Спасибо

1
Maikiii 11 Ноя 2020 в 23:49

2 ответа

Лучший ответ

Ваши столбцы Data имеют тип int. Сначала преобразуйте его в строки:

df['Data'] = df['Data'].astype(str)
df['period'] = (df[['Info_1','Info_2','Info_3','Data']]
                   .apply(lambda x: ' '.join(x[x!=''].unique()), axis=1)
               )

Выход:

     Name  Age Info_1    Info_2  Info_3 Data Sex              period
0    Lolo   19   Tall  New York    Tall  123   F   Tall New York 123
1    Mike   34  Large     Paris   Paris  268   M     Large Paris 268
2  Tobias   13  Small    Lisbon      Hi   76   M  Small Lisbon Hi 76
3    Luke   45  Small             Small  909   M           Small 909
4     Sam   52           Berlin  Thanks   87   M    Berlin Thanks 87
2
Quang Hoang 11 Ноя 2020 в 20:55

Я думаю, что, вероятно, проще всего сначала просто объединить все поля, которые вы хотите, с пробелом между ними:

df['Info'] = df.Info_1 + ' ' +  df.Info_2 + ' ' + df.Info_3 + ' ' + df.Data.astype(str)

Затем вы можете написать функцию для удаления повторяющихся слов из строки, примерно так:

def remove_dup_words(s):
    words = s.split(' ')
    unique_words = pd.Series(words).drop_duplicates().tolist()
    return ' '.join(unique_words)

И примените эту функцию к полю Info:

df['Info'] = df.Info.apply(remove_dup_words)

Весь код вместе:

import pandas as pd

def remove_dup_words(s):
    words = s.split(' ')
    unique_words = pd.Series(words).drop_duplicates().tolist()
    return ' '.join(unique_words)

Name = ['Lolo', 'Mike', 'Tobias','Luke','Sam']
Age = [19, 34, 13, 45, 52]
Info_1 = ['Tall', 'Large', 'Small', 'Small','']
Info_2 = ['New York', 'Paris', 'Lisbon', '', 'Berlin']
Info_3 = ['Tall', 'Paris', 'Hi', 'Small', 'Thanks']
Data = [123,268,76,909,87]
Sex = ['F', 'M', 'M','M','M']

df = pd.DataFrame({'Name' : Name, 'Age' : Age, 'Info_1' : Info_1, 'Info_2' : Info_2, 'Info_3' : Info_3, 'Data' : Data, 'Sex' : Sex})

df['Info'] = df.Info_1 + ' ' +  df.Info_2 + ' ' + df.Info_3 + ' ' + df.Data.astype(str)
df['Info'] = df.Info.apply(remove_dup_words)

print(df)

     Name  Age Info_1    Info_2  Info_3  Data Sex                Info
0    Lolo   19   Tall  New York    Tall   123   F   Tall New York 123
1    Mike   34  Large     Paris   Paris   268   M     Large Paris 268
2  Tobias   13  Small    Lisbon      Hi    76   M  Small Lisbon Hi 76
3    Luke   45  Small             Small   909   M          Small  909
4     Sam   52           Berlin  Thanks    87   M    Berlin Thanks 87
1
Robert 11 Ноя 2020 в 21:10