Создание индекса / строк из различных значений в столбце DataFrame - PullRequest
4 голосов
/ 06 мая 2020

Я действительно не знал, как дать хороший описательный заголовок, но вот мой вопрос. Давайте рассмотрим DataFrame df:

     col_name
0    Category1
1     item1()
2     item2()
3    Category2
4     item3()
5     item4()
6     item5()

Мне нужно получить это:

     categories   items
0     Category1   item1
1     Category1   item2
2     Category2   item3
3     Category2   item4
4     Category2   item5

Но categories может быть континентами, а items - странами. Я знаю, что все элементы имеют () с выражением внутри, поэтому я могу легко предоставить логическую маску, а затем создать список categories с:

msk = df[~df['col_name'].str.contains('[^A-Za-z\s]')]['col_name'].tolist()

Но теперь, теперь я застрял. Не могли бы вы дать мне какой-нибудь совет?

Ответы [ 2 ]

6 голосов
/ 06 мая 2020

Давайте выполним startswith поиск строки категории и создадим другой столбец с помощью ffill

df['category']=df.col_name.mask(df.col_name.str.endwith('Category')).ffill()
#df['category']=df.col_name.mask(df.col_name.str.endswith(')')).ffill()
df=df[df.category!=df.col_name]
df
Out[241]: 
  col_name   category
1  item1()  Category1
2  item2()  Category1
4  item3()  Category2
5  item4()  Category2
6  item5()  Category2
4 голосов
/ 06 мая 2020

Здесь необходимо указать, как различать guish не категории или значения категории. В этом решении проверяются значения, если ( в данных, затем заменяют эти значения отсутствующими значениями и заполняют их вперед, затем заменяют () и последний фильтр исходной маской:

m = df['col_name'].str.contains('(', regex=False)
df['categories'] = df['col_name'].mask(m).ffill()
df['items'] = df.pop('col_name').str.replace('[\(\)]', '')
df = df[m]

print (df)
  categories  items
1  Category1  item1
2  Category1  item2
4  Category2  item3
5  Category2  item4
6  Category2  item5

С вашей маской с добавленные цифры - решение заменено на:

m = df['col_name'].str.contains('[^A-Za-z0-9\s]')
df['categories'] = df['col_name'].mask(m).ffill()
df['items'] = df.pop('col_name').str.replace('[\()]', '')
df = df[m]

print (df)
  categories  items
1  Category1  item1
2  Category1  item2
4  Category2  item3
5  Category2  item4
6  Category2  item5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...