2016-03-02 4 views
3

Начиная с этого dataframe df:панды получить вложенные значения строки из массивов

node1,node2,lang,w,c1,c2 
1,2,it,1,a,a 
1,2,en,1,a,a 
2,3,es,2,a,b 
3,4,it,1,b,b 
5,6,it,1,c,c 
3,5,tg,1,b,c 
1,7,it,1,a,a 
7,1,es,1,a,a 
3,8,es,1,b,b 
8,4,es,1,b,b 
1,9,it,1,a,a 

Я выполнил groupby операции, как:

g = df.groupby(['c1','c2'])['lang'].unique().reset_index() 

результатов:

c1 c2   lang 
0 a a [it, en, es] 
1 a b   [es] 
2 b b  [it, es] 
3 b c   [tg] 
4 c c   [it] 

Сохранение в. csv и прочитать его обратно:

g.to_csv('myfile.csv') 
g = pd.read_csv('myfile.csv') 

получения другого формата lang колонки:

c1 c2    lang 
0 a a ['it' 'en' 'es'] 
1 a b   ['es'] 
2 b b  ['it' 'es'] 
3 b c   ['tg'] 
4 c c   ['it'] 

Моя цель сейчас, чтобы подсчитать количество элементов в каждой строке lang, и быть в состоянии получить эти значения по отдельности. Я пытался построить новый столбец с длиной массива строки:

g['len'] = df['lang'].apply(lambda x: x.size) 

получение:

AttributeError: 'str' object has no attribute 'size' 

Глядя значение lang колонки, я понял, что после GroupBy, что колонна стала беспорядок:

In [113]: g['lang'].values 
Out[113]: array(["['it' 'en' 'es']", "['es']", "['it' 'es']", "['tg']", "['it']"], dtype=object) 

Как я могу получить длину каждого вложенного массива строк, а затем получить значение каждой строки в нем? Я думал, что тип преобразования, но мой случай немного сложнее.

EDIT: добавить информацию о разном формате столбца lang до и после записи/чтения в/из .csv.

+0

просьба представить ожидаемой выходной – MaxU

ответ

3

apply Просто len:

In [145]: 
g['size'] = g['lang'].apply(len) 
g 

Out[145]: 
    c1 c2   lang size 
0 a a [it, en, es]  3 
1 a b   [es]  1 
2 b b  [it, es]  2 
3 b c   [tg]  1 
4 c c   [it]  1 
+0

Спасибо! Знаете ли вы, почему запись в csv после groupby и чтение файла обратно дают мне другой формат столбца lang? Поэтому я могу применить ваш метод до сохранения в файл, но не после его чтения? –

+0

по умолчанию будет выписан индекс, вы, возможно, снова его заново читаете, добавляя новый столбец, это моя догадка – EdChum

+0

Это не работает на моем ПК после чтения/записи csv 'gar ['lang']. Apply (len) 'return' [16, 6, 11, 6, 6] ', длина строк. ИМХО, используя pickle вместо csv read/write - хорошее решение здесь; или 'g = pd.read_csv ('myfile.csv', converters = {'lang': a_very_tricky_function})'. –

Смежные вопросы