판다

2017-10-09 1 views
1

알려지지 크기 내에서 일련의 주어진 :판다

import pandas as pd 
sr = pd.Series([['a', 'b', 'c', 'b'], ['a', 'a', 'd'], ['b']]) 

[출력] : 목표 작성 내측 목록의 값을 사용하는 것이다

0 [a, b, c, b] 
1  [a, a, d] 
2    [b] 

각 열의 항목 수로 그 값을 채 웁니다. 즉,

 a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

그는 위의 각 행을 반복하고 Counter 객체로 변환하고 카운터 사전의 목록을 사용하여 dataframe을 다시 만들어 :

>>> from collections import Counter 
>>> pd.DataFrame([dict(Counter(row)) for row in pd.Series([['a', 'b', 'c', 'b'], ['a', 'a', 'd'], ['b']])]) 

이 할 수있는 간단한 방법이 있나요를? 아마도 .pivot()으로?

답변

2

나는 입력이 이전 질문에서 같은 list 경우 생각 :

lol = [['a', 'b', 'c', 'b'], ['a', 'a', 'd'], ['b']] 
df = pd.DataFrame(Counter(x) for x in lol) 
print (df) 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

가 입력 Series 경우 :

df = pd.DataFrame(sr.values.tolist()).apply(pd.value_counts, 1) 
print (df) 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 
2

사용

In [179]: pd.DataFrame(Counter(x) for x in sr) 
Out[179]: 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

또는

In [182]: sr.apply(lambda x: pd.Series(Counter(x))) 
Out[182]: 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

또는 value_counts

In [170]: sr.apply(lambda x: pd.Series(x).value_counts()) 
Out[170]: 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

또는

In [174]: pd.DataFrame(pd.Series(x).value_counts() for x in sr) 
Out[174]: 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN