這是我的資料框的示例:
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]]
但看起來在實際資料框上需要很長時間......有沒有人有更好的想法?
uj5u.com熱心網友回復:
在我看來,您基本上是在進行分組/平均和支點。
import pandas as pd
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 = (df.groupby(['group','round'])['score'].mean()*10 1).reset_index()
df.pivot_table(index='group',columns='round',values='score', fill_value='NA').reset_index().values
輸出
array([['a', 'NA', 7.0, 3.0],
['b', 7.5, 'NA', 5.333333333333333],
['c', 'NA', 'NA', 5.0],
['d', 2.0, 10.0, 'NA']], dtype=object)
uj5u.com熱心網友回復:
不平衡的資料集可能會顯示不同的結果,但我使用 Blow 腳本進行了測驗,發現即使使用 pandas 資料幀,結果也顯示出良好的性能。但是,您始終可以將其與本機 python 資料結構進行比較。
import random
import datetime
import pandas as pd
def generate_data(): # augmentation
data = {'group': [], 'round': [], 'score': []}
for index in range(10 ** 6): # sample size
data['group'].append(random.choice(['a', 'b', 'c', 'd']))
data['round'].append(random.randrange(1, 4))
data['score'].append(round(random.random(), 1))
return data
def calc_with_native_ds(data): # native python data structure
pass
def calc_with_pandas_df(df): # pandas dataframe
return df.groupby(['group', 'round']).mean()
if __name__ == '__main__':
data = generate_data()
df = pd.DataFrame(data)
print(df.shape)
start_datetime = datetime.datetime.now()
# calc_with_native_ds(data)
calc_with_pandas_df(df)
end_datetime = datetime.datetime.now()
elapsed_time = round((end_datetime - start_datetime).total_seconds(), 5)
print(f"elapsed_time: {elapsed_time}")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/353856.html
標籤:Python 熊猫 数据框 优化 pandas-groupby
上一篇:某些列滿足條件的資料框子集
