假设我有一个数据帧,其中某些条目是数组/列表/集:
Row 0 [a, d, g, h, j]
Row 1 [d, j, a, p]
Row 2 [c, f, t, a]
Row 3 [a, h]
Row 4 []
Row 5 [d, j]
我想将其转换为 df,其中我们将数组条目映射到其出现的总频率(仅在该列中(:
a c d f g h j p
4 1 3 1 1 2 3 1
我该怎么做?(条形图需要它(。
现在假设数据帧有另一列:
Row 0 [a, d, g, h, j] 100
Row 1 [d, j, a, p] 300
Row 2 [c, f, t, a] 200
Row 3 [a, h] 160
Row 4 [] 40
Row 5 [d, j] 600
如果我想获取每个数组条目 col 2 的平均值,我将如何做?澄清一下,我想要:
a (100 + 300 + 200 + 160)/4 = 760/4 = 190
c 200/1 = 200
d (100 + 300)/2 = 200
f 200
... etc
谢谢,我现在正在学习熊猫,这真的很有趣,但也不是微不足道的。
使用推断的设置:
设置:
data=[
["Row 0", list("adghj"), 100],
["Row 1", list("djap"), 300],
["Row 2", list("cfta"), 200],
["Row 3", list("ah"), 160],
["Row 4", [], 40],
["Row 5", list("dj"), 600]
]
import pandas as pd
df=pd.DataFrame(data, columns=["id", "wrds", "val"])
两个问题的解决方案:
df=df.explode("wrds")[["wrds", "val"]].groupby("wrds").agg(["count", "mean"])
输出:
val
count mean
wrds
a 4 190.000000
c 1 200.000000
d 3 333.333333
f 1 200.000000
g 1 100.000000
h 2 130.000000
j 3 333.333333
p 1 300.000000
t 1 200.000000
首先,让我们重新创建数据帧:
import pandas as pd
df = pd.DataFrame({
'Rows': ['Row 0','Row 1','Row 2','Row 3','Row 4','Row 5'],
'Letters': [['a', 'd', 'g', 'h', 'j'], ['d', 'j', 'a', 'p'], ['c', 'f', 't', 'a'], ['a', 'h'], [], ['d', 'j']],
'Values': [100, 300, 200, 160, 40, 600]
})
收益 率:
Rows Letters Values
0 Row 0 [a, d, g, h, j] 100
1 Row 1 [d, j, a, p] 300
2 Row 2 [c, f, t, a] 200
3 Row 3 [a, h] 160
4 Row 4 [] 40
5 Row 5 [d, j] 600
现在,我们可以使用explode()
将您的list
类型列转换为单独的行并解决您的第一个问题:
df['Letters'].explode().value_counts().sort_index()
收益 率:
a 4
c 1
d 3
f 1
g 1
h 2
j 3
p 1
t 1
对于第二部分,我将参考@GrzegorzSkibinski的答案,即我如何处理这个问题。他的解决方案有效地结合了您帖子中的两个问题:
df.explode('Letters').groupby('Letters').agg({'Values': 'mean'})
收益 率:
Values
Letters
a 190.000000
c 200.000000
d 333.333333
f 200.000000
g 100.000000
h 130.000000
j 333.333333
p 300.000000
t 200.000000