我有清单
u=[[1, 1], [2, 1, 1, 1], [2, 2, 1, 1, 1, 1, 2, 2], [2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2], [2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2]]
我想使用pandas创建一个DataFrame,其中行的长度为u,列由列表列表中的数字组给出。
我希望此DataFrame的元素是元素出现的频率。例如,从上面,我想得到下表
在上面的表中,带有1的列给出了每个列表中的1的数量,而2给出了数量为2.在单元格(1,1)中,通过计算第一个列表中的1的数量来获得数字2是[1,1]。在单元格(2,1)中,数字3是通过计算列表[2,1,1,1]中的数量来获得的,而在单元格(2,2)中,数字2是通过计算两个频率来获得的。在列表[2,1,1,1]中,整个过程重复相同的程序。
我知道要计算列表中重复元素的数量,我必须使用count。例如 [1,1,1,2] .Count之间的(1)= 3 我想知道的是使用Pandas,以便我得到如上所述的DataFrame。有可能这样做吗?
答案 0 :(得分:4)
您可以使用Counter
将列表转换为字典。然后使用pd.DataFrame
转换该字典
import pandas as pd
from collections import Counter
df = pd.DataFrame([Counter(u_) for u_ in u]).fillna(0)
注意这里没有4,您可以手动将其添加到字典中,或者只是在df[4] = 0
答案 1 :(得分:1)
collections.Counter
对此非常有用:
首先从列表中创建Counter
个实例,然后使用这些实例来实现DataFrames:
u=[[1, 1], [2, 1, 1, 1], [2, 2, 1, 1, 1, 1, 2, 2], [2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2], [2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2]]
from collections import Counter
import pandas as pd
df = pd.DataFrame([Counter(e) for e in u]).fillna(0)
df[4] = 0.0
print(df)
1 2 3 4
0 2 0.0 0.0 0.0
1 3 1.0 0.0 0.0
2 4 4.0 0.0 0.0
3 5 10.0 1.0 0.0
4 6 20.0 6.0 0.0
这是可能的,因为幕后Counter
的行为类似于dict
。