2015-04-13 2 views
2

У меня есть DataFrame вроде этого:Pandas: как преобразовать ячейку с несколькими значениями в несколько строк?

Name asn count 
Org1 asn1,asn2 1 
org2 asn3  2 
org3 asn4,asn5 5 

Я хотел бы, чтобы преобразовать мой DataFrame, чтобы выглядеть следующим образом:

Name asn count 
Org1 asn1 1 
Org1 asn2 1 
org2 asn3 2 
org3 asn4 5 
Org3 asn5 5 

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

df2 = df.asn.str.split(',').apply(pd.Series)   
df2.index = df.Name         
df2 = df2.stack().reset_index('Name') 

Может ли кто-нибудь помочь?

+0

Какой тип данных DataFrame? Строка, список, ndarray? Можете ли вы привести пример кода, необходимого для создания ndarray в примере? На самом деле не совсем ясно, что такое структура, просто глядя на нее. – TheBlackCat

ответ

3

Выполняя эту же идею, вы можете установить MultiIndex для df2, а затем стек. Например:

>>> df2 = df.asn.str.split(',').apply(pd.Series) 
>>> df2.index = df.set_index(['Name', 'count']).index 
>>> df2.stack().reset_index(['Name', 'count']) 
    Name count  0 
0 Org1  1 asn1 
1 Org1  1 asn2 
0 org2  2 asn3 
0 org3  5 asn4 
1 org3  5 asn5 

Затем вы можете переименовать столбец и указать индекс по вашему выбору.

0

В качестве альтернативы:

import pandas as pd 
from StringIO import StringIO 

ctn = '''Name asn count 
Org1 asn1,asn2 1 
org2 asn3  2 
org3 asn4,asn5 5''' 

df = pd.read_csv(StringIO(ctn), sep='\s*', engine='python') 
s = df['asn'].str.split(',').apply(pd.Series, 1).stack() 
s.index = s.index.droplevel(-1) 
s.name = 'asn' 
del df['asn'] 
df = df.join(s) 

print df 

Результат:

Name count asn 
0 Org1  1 asn1 
0 Org1  1 asn2 
1 org2  2 asn3 
2 org3  5 asn4 
2 org3  5 asn5 
Смежные вопросы