как добавить новый столбец в фрейм данных pandas с помощью apply

#python-3.x #pandas #dataframe

Вопрос:

Я пытаюсь добавить 2 новых столбца в фрейм данных pandas.

 items = df["item_name"]


groupedWeights = [re.findall('(d (?:ml| ml|g| g|gm| gm))', i) for i in items]
flattenedWeights = [y for x in groupedWeights for y in x]



groupedCounts = [re.findall('(d (?:x| x|pk| pk|pack| pack|packs| packs))', i) for i in items]
groupedCounts.append([re.findall('((?:pack of |pack of | packs of) d )', i) for i in items])
flattenedCounts = [y for x in groupedCounts for y in x]



df.to_csv('newColumns.csv', index = False)
 

Пытался

 #df['flattenedWeights'] = pd.Series(flattenedWeights)
#df['flattenedCounts'] = pd.Series(flattenedCounts)
 

и это работает, но он получает все значения, которые не являются пустыми, в верхней части столбца, а все пустые находятся внизу. Мне нужно, чтобы они были в том же порядке, что и индекс df, но так как индекс df равен 8 тыс., а у новых около 6 тыс., потому что некоторые из них пусты…

Также пробовал

 def fab():
    groupedWeights = [re.findall('(d (?:ml| ml|g| g|gm| gm))', i) for i in items]
    flattenedWeights = [y for x in groupedWeights for y in x]
df['newcolumn'] = df.apply(fab, axis=1)
 

и

 df["flattenedWeights"] = df.apply(flattenedWeights, axis=1)
 

но без всякой удачи.

Комментарии:

1. Можете ли вы добавить некоторый образец данных к вопросу и ожидаемому результату?

Ответ №1:

Вы можете использовать:

 df['some_name'] = df['name'].apply(col_data)
 

если для вашей функции требуется несколько колов, вы можете использовать:

 df['new_column_name'] = df.apply(lambda x: my_function(x['value_1'], x['value_2']), axis=1)
 

Комментарии:

1. Вы читали, что я уже пробовал это, и это не работает?:)

2. @Osiris вы пытались добавить оператор return в конце вашей функции fab, потому что он ничего не возвращает, или же попытались сделать его похожим на реализацию лямбда-функции

Ответ №2:

Решается с помощью

 df['item_size'] = df['item_name'].apply(lambda x: re.findall('(d (?:ml| ml|g| g|l| l|gm| gm|kg|cl| kg|kg | cl|cl ))', x))

df['item_count'] = df['item_name'].apply(lambda y: re.findall('(d (?:x| x|pk| pk|pack| pack| pack of |packs| packs| pack of|pack of | packs of))', y))