【发布时间】:2021-11-08 11:29:25
【问题描述】:
这是我的数据框的一个示例:
d = {'group': ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'c', 'd', 'd'], \
'round': [3, 3, 2, 1, 3, 1, 3, 3, 3, 2, 1], \
'score': [0.3, 0.1, 0.6, 0.8, 0.2, 0.5, 0.5, 0.6, 0.4, 0.9, 0.1]}
df = pd.DataFrame(d)
df
group round score
0 a 3 0.3
1 a 3 0.1
2 a 2 0.6
3 b 1 0.8
4 b 3 0.2
5 b 1 0.5
6 b 3 0.5
7 b 3 0.6
8 c 3 0.4
9 d 2 0.9
10 d 1 0.1
我的实际数据框有 6 列和 > 1,000,000 行。我正在尝试找出执行以下操作的最快方法:
对于每组,找出平均分,并用它对 3 轮中的每一轮进行一些计算。如果没有分数,写'NA'。
我不确定创建列表列表然后将其转换为数据框或创建新数据框并填充它是否会更快,所以我先使用列表:
def test_df(data):
value_counts = data['group'].value_counts().to_dict()
avgs = []
for key, val in value_counts.items():
row = data[data['group'] == key]
x = [key]
if val < 2:
x.extend([10 * row['score'].values[0] + 1 if i == row['round'].values[0] else 'NA' for i in range (1,4)])
else:
x.extend([(10 * row[row['round'] == i]['score'].mean() + 1) if len(row[row['round'] == i]) > 0 else 'NA' for i in range(1, 4)])
avgs.append(x)
return avgs
在这里我创建了一个单独的案例,因为我的数据中大约 80% 的组只有一行,所以我认为它可能会加快速度?
这会以[group, round 1, round 2, round 3] 格式返回正确的结果
[['b', 7.5, 'NA', 5.333333333333333],
['a', 'NA', 7.0, 3.0],
['d', 2.0, 10.0, 'NA'],
['c', 'NA', 'NA', 5.0]]
但看起来实际数据帧需要很长时间... 有没有人有更好的想法?
【问题讨论】:
-
1) 看看
groupby,而不是使用for k, v in value_counts.items()。 2)考虑如何跨组/轮进行操作:例如data.groupby('group').transform('size')将组的值计数放在每一行上。 -
@QuangHoang 是的,我现在正在小组中玩多列。你的代码给了我一个错误,
Transform function invalid for data types
标签: python pandas dataframe optimization pandas-groupby