将列值转换为整数列 - 熊猫

时间:2017-10-09 07:16:41

标签: python pandas counter series nested-lists

给出一系列未知大小的内部列表:

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

[OUT]:

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个对象并使用计数器词典列表重新创建数据框来实现上述目标:

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

有更简单的方法吗?也许是.pivot()

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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