Python 熊猫:如果相邻列中的字符串包含来自另一个数据帧的子字符串,则数据帧列中的平均值

Python 熊猫:如果相邻列中的字符串包含来自另一个数据帧的子字符串,则数据帧列中的平均值,python,pandas,aggregate,Python,Pandas,Aggregate,我已经在这上面呆了一段时间了!我有两个熊猫数据帧: 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

我已经在这上面呆了一段时间了!我有两个熊猫数据帧:

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\u avgs
中创建第二列,如果
color\u avgs['colors]
中的字符串包含
color\u avgs['colors]
中的子字符串/color,则该列将是
color\u得分['score']中的值的平均值

color_scores.loc[color_scores['colors'].str.contains('blue'), 'score'].mean()
9.866666666666667
我知道如何为每种颜色手动执行此操作(如下)。但是,我不知道如何循环使用
color\u avgs['colors']
中列出的所有颜色,并将结果添加到新列(
color\u avgs['average']

提前谢谢

我认为需要:

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
说明

  • 循环方式和每行向2个计数器添加
    颜色
    和计数的拆分值
  • mean
  • 最后一列
  • 唯一的解决方案:

    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
    
    说明

  • 数据帧的第一个值
  • 重塑
  • 各组总平均数
  • 最后一列

  • 对不起,马克·杜普没被注意到,在我把便条留给你的同时,他又遇到了问题。。签名。@Wen-没问题:)将接受您的建议,并添加更多解释:-)