Как выбрать одну строку с самым длинным предложением для определенного столбца и объединить, чтобы сформировать новый фрейм данных в Python? - PullRequest
2 голосов
/ 02 мая 2020

Набор данных, который я использую, выглядит следующим образом. Это набор данных с субтитрами для видео с субтитрами в столбце «Описание».

Video_ID       Description
mv89psg6zh4    A bird is bathing in a sink.
mv89psg6zh4    A faucet is running while a bird stands and is taking bath under it.
mv89psg6zh4    A bird gets washed.
mv89psg6zh4    A parakeet is taking a shower in a sink.
mv89psg6zh4    The bird is taking a bath under the faucet.
mv89psg6zh4    A bird is standing in a sink drinking water.
l7x8uIdg2XU    A woman is pouring ingredients into a bowl and then eating it.
l7x8uIdg2XU    A woman is adding milk to some pasta.
l7x8uIdg2XU    A person adds ingredients to pasta. 
l7x8uIdg2XU    the girls are doing the cooking.

Однако количество субтитров для каждого видео отличается и не является одинаковым.

Я намереваюсь извлечь одну строку с самым длинным «Description» (то есть с максимальным количеством слов) для одного уникального Video_ID и сформировать новый фрейм данных, объединяющий эти уникальные строки.

Нужный результат должен выглядеть следующим образом:

Требуемый датафрейм -

Video_ID       Description
mv89psg6zh4    A faucet is running while a bird stands and is taking bath under it.
l7x8uIdg2XU    A woman is pouring ingredients into a bowl and then eating it.

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

Я пытался использовать следующий код:

s = df.index.to_series().groupby(df['Video_ID']).apply(lambda x: len(x['Description']).max())

Но, похоже, это не работает. Можете ли вы предложить правильный путь?

1 Ответ

2 голосов
/ 02 мая 2020

Используйте Series.str.len для длин, а затем получите максимальные значения индекса для групп по DataFrameGroupBy.idxmax и последний выбор по DataFrame.loc:

df1 = df.loc[df['Description'].str.len().groupby(df['Video_ID'], sort=False).idxmax()]
print (df1)
      Video_ID                                        Description
1  mv89psg6zh4  A faucet is running while a bird stands and is...
6  l7x8uIdg2XU  A woman is pouring ingredients into a bowl and...

Подробности :

print (df['Description'].str.len())
0    28
1    68
2    19
3    40
4    43
5    44
6    62
7    37
8    35
9    32
Name: Description, dtype: int64

print (df['Description'].str.len().groupby(df['Video_ID'], sort=False).idxmax())
Video_ID
mv89psg6zh4    1
l7x8uIdg2XU    6
Name: Description, dtype: int64

Для фильтра возможны несогласованные строки, используйте Index.isin с инвертированной маской ~ и boolean indexing:

df2 = df[~df.index.isin(df1.index)]
print (df2)
      Video_ID                                   Description
0  mv89psg6zh4                  A bird is bathing in a sink.
2  mv89psg6zh4                           A bird gets washed.
3  mv89psg6zh4      A parakeet is taking a shower in a sink.
4  mv89psg6zh4   The bird is taking a bath under the faucet.
5  mv89psg6zh4  A bird is standing in a sink drinking water.
7  l7x8uIdg2XU         A woman is adding milk to some pasta.
8  l7x8uIdg2XU           A person adds ingredients to pasta.
9  l7x8uIdg2XU              the girls are doing the cooking.

РЕДАКТИРОВАТЬ: Решение выше возвращает только один ряд максимальной длины на группы. (Здесь работает то же самое, потому что только одна максимальная длина для групп в данных выборки)

Если требуется несколько максимальных длин для групп, возможна максимальная длина comapre в GroupBy.transform:

s = df['Description'].str.len()
mask = s.groupby(df['Video_ID'], sort=False).transform('max').eq(s)
df1 = df[mask]
print (df1)
      Video_ID                                        Description
1  mv89psg6zh4  A faucet is running while a bird stands and is...
6  l7x8uIdg2XU  A woman is pouring ingredients into a bowl and...

df2 = df[~mask]
print (df2)
      Video_ID                                   Description
0  mv89psg6zh4                  A bird is bathing in a sink.
2  mv89psg6zh4                           A bird gets washed.
3  mv89psg6zh4      A parakeet is taking a shower in a sink.
4  mv89psg6zh4   The bird is taking a bath under the faucet.
5  mv89psg6zh4  A bird is standing in a sink drinking water.
7  l7x8uIdg2XU         A woman is adding milk to some pasta.
8  l7x8uIdg2XU           A person adds ingredients to pasta.
9  l7x8uIdg2XU              the girls are doing the cooking.

Детали:

print (s.groupby(df['Video_ID'], sort=False).transform('max'))
0    68
1    68
2    68
3    68
4    68
5    68
6    62
7    62
8    62
9    62
Name: Description, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...