Упорядочить столбцы, содержащие строку, сначала в DataFrame Pandas - PullRequest
1 голос
/ 17 мая 2019

Допустим, у меня есть DataFrame, содержащий несколько строк с разными фразами, разделенными запятыми, как это:

>>> df = pd.DataFrame({'phrase':['dog, cat, cow','bird, cat','cow, bird','dog, cow','bird'],
})
>>> df
          phrase
0  dog, cat, cow
1      bird, cat
2      cow, bird
3       dog, cow
4           bird

Я хочу сделать так, чтобы строки, в столбце которых было указано «птица» phrase, были включеныпервые строки как это:

          phrase
0      bird, cat
1      cow, bird
2           bird
3  dog, cat, cow
4       dog, cow

Как я могу это сделать?Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 17 мая 2019

Использование sorted с пользовательским key

Ex:

import pandas as pd

df = pd.DataFrame({'phrase':['dog, cat, cow','bird, cat','cow, bird','dog, cow','bird']})
df["New"] = pd.Series(sorted(df["phrase"].tolist(), key=lambda x: 0 if "bird" in x else 1))
print(df)

Выход:

          phrase            New
0  dog, cat, cow      bird, cat
1      bird, cat      cow, bird
2      cow, bird           bird
3       dog, cow  dog, cat, cow
4           bird       dog, cow
1 голос
/ 17 мая 2019

Вы можете использовать Series.str.contains для логической маски, условия инвертирования и вызова Series.argsort для позиций, последнее изменение порядка на DataFrame.iloc:

df = df.iloc[(~df['phrase'].str.contains('bird')).argsort()]
print (df)
          phrase
1      bird, cat
2      cow, bird
4           bird
0  dog, cat, cow
3       dog, cow

Деталь

a = df['phrase'].str.contains('bird')
b = (~df['phrase'].str.contains('bird'))
c = (~df['phrase'].str.contains('bird')).argsort()
print (df.assign(contains=a, invert=b, argsort=c))
          phrase  contains  invert  argsort
0  dog, cat, cow     False    True        1
1      bird, cat      True   False        2
2      cow, bird      True   False        4
3       dog, cow     False    True        0
4           bird      True   False        3
1 голос
/ 17 мая 2019

Добавьте столбец "has bird", отсортируйте его и, если необходимо, отбросьте.

(df.assign(has_bird=df.phrase.apply(lambda l: 'bird' in l))
    .sort_values(by='has_bird', ascending=False)
    .drop('has_bird', axis=1))
    phrase
1   bird, cat
2   cow, bird
4   bird
0   dog, cat, cow
3   dog, cow

Вы можете использовать assign, sort_values и drop для цепочки.

Если у вас старая версия панд, используйте

df['has_bird'] = df.phrase.apply(lambda l: 'bird' in l))
df.sort_values(by='has_bird', ascending=False).drop('has_bird', axis=1)
0 голосов
/ 17 мая 2019

Просто создайте дополнительный столбец с логическим значением в зависимости от условия, а затем сортируйте по этому столбцу.Ниже код должен работать.

import pandas as pd

df = pd.DataFrame({'phrase':['dog, cat, cow','bird, cat','cow, bird','dog, cow','bird']})
df['bird_exists'] = df['phrase'].apply(lambda x : 'bird' in x.lower())

df = df.sort_values('bird_exists', ascending=False)

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