我被困在这一段时间了!我有两个pandas数据帧:
ByteBuf
我要做的是在import pandas as pd
color_scores = pd.DataFrame({'score': [12.4, 9.8, 7.4, 2.6, 14.8],
'colors': ['blue, red, green', 'blue, purple, orange',
'blue, pink, yellow', 'purple, pink, orange',
'yellow, pink, green']})
color_avgs = pd.DataFrame({'colors': [
'blue',
'red',
'green',
'purple',
'orange',
'pink',
'yellow',
]})
中创建第二列,如果color_avgs
中的字符串包含子字符串/颜色,则color_scores['score']
中值的平均值color_scores['colors]
。
我知道如何为每种颜色手动执行此操作(下方)。但是,我不知道如何遍历color_avgs['colors']
中列出的所有颜色,并将结果添加到新列(color_avgs['colors']
)。
color_avgs['average']
提前致谢!
答案 0 :(得分:1)
我认为需要:
from collections import Counter
c1, c2 = Counter(), Counter()
for row in color_scores.itertuples():
for i in row[1].split(', '):
c1[i] += row[2]
c2[i] += 1
s = pd.Series(c1).div(pd.Series(c2))
print (s)
blue 9.866667
green 13.600000
orange 6.200000
pink 8.266667
purple 6.200000
red 12.400000
yellow 11.100000
dtype: float64
color_avgs['new'] = color_avgs['colors'].map(s)
print (color_avgs)
colors new
0 blue 9.866667
1 red 12.400000
2 green 13.600000
3 purple 6.200000
4 orange 6.200000
5 pink 8.266667
6 yellow 11.100000
<强>解释强>:
itertuples
循环,每行添加2个计数器分割值colors
和计数mean
map
新专栏Pandas only解决方案:
s = (color_scores.set_index('score')['colors']
.str.split(', ', expand=True)
.stack()
.reset_index(name='a')
.groupby('a')['score'].mean())
color_avgs['new'] = color_avgs['colors'].map(s)
print (color_avgs)
colors new
0 blue 9.866667
1 red 12.400000
2 green 13.600000
3 purple 6.200000
4 orange 6.200000
5 pink 8.266667
6 yellow 11.100000
<强>解释强>: