2015-09-18 3 views
0

Мои данные выглядят следующим образомПанды в Wide/преобразование нескольких строк в одну ячейку

Name  Title  ID 
ED  HHH  11111 
ED  HHH  11112 
ED  HHH  11113 
ED  HHH  11114 
AD  BBB  11119 
AD  BBB  11133 

Где я хочу, чтобы это выглядело, как это (где все идентификаторы находятся в одной ячейке отделена запятой, например)

Name  Title  ID 
ED  HHH  11111, 11112, 11113, 11114 
AD  BBB  11119, 11133 

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

Я также объединил поле Names и Title и попробовал код ниже, но я получаю «не могу пометить индекс нулевым ключом», и я не уверен, что этот вариант будет работать.

df_long.pivot(index='Combined', values='ID') 

Я тоже пытаюсь это так (ниже), но его принято в течение 6 часов (1,5 млн строк) и до сих пор не завершена, и это не идеальная работа, когда, вероятно, лучший способ.

for x in df.values: 
for y in df1_list: 
    if x[2] == y[2]: 
     if x[3] == y[3]: 
      if x[4] not in y[4]: 
       y[4].append(x[4]) 

Любая идея или направление для моей проблемы использовать панды или другое решение за пределами панд?

ответ

1

Это показывает, как использовать лямбда для конкатенации нескольких ячеек вместе панд: Combine two columns of text in dataframe in pandas/python

Он может быть использован в aggfunc аргумент pd.pivot_table, как это:

import numpy as np 
import pandas as pd 
from pandas import Series, DataFrame 

# here i copied your data frame and assign it to the variable "df" 
df = pd.read_clipboard() 
df['ID'] = df['ID'].astype('str') 
pd.pivot_table(df,index=['Name','Title'],values='ID',aggfunc=lambda x: ', '.join(x)) 
Out[15]: 
Name Title 
AD BBB     11119, 11133 
ED HHH  11111, 11112, 11113, 11114 
Name: ID, dtype: object 

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

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