Pandas:如果相邻列中的字符串包含来自另一个DataFrame的子字符串,则DataFrame列中的平均值

时间:2018-03-27 12:21:21

标签: python pandas aggregate

我被困在这一段时间了!我有两个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']

提前致谢!

1 个答案:

答案 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

<强>解释

  1. itertuples循环,每行添加2个计数器分割值colors和计数
  2. 创建系列并除以mean
  3. 上一篇map新专栏
  4. 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
    

    <强>解释

    1. DataFrame
    2. 的第一个split
    3. 重塑stack
    4. 每组总平均值
    5. 上一篇map新专栏