谈到列值到整数列 - 熊猫
问题描述:
鉴于一系列未知大小内部列表的:谈到列值到整数列 - 熊猫
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
我试过实现t他以上通过每一行迭代并将它们转换为Counter
对象和使用计数器词典列表中重新创建数据框:
>>> from collections import Counter
>>> pd.DataFrame([dict(Counter(row)) for row in pd.Series([['a', 'b', 'c', 'b'], ['a', 'a', 'd'], ['b']])])
有没有一种简单的方法来做到这一点?也许与.pivot()
?
答
我想,如果输入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
答
使用
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