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-没问题:)将接受您的建议,并添加更多解释:-)