第一次在這里發帖并且是 Python 的新手,如果我遺漏了下面的任何關鍵資訊,請提前致歉。
本質上,我有一個大的 CSV 檔案,我可以在腳本上稍微清理一下,其中包含超過 150 英里資料的各種數值,每條資料線都是一英尺。在我稍微清理一下檔案后,表格通常如下所示:
ABC Mile Ft Param1
A 1 1000 0.1234
A 1 1001 0.1111
A 1 1002 0.1221
A 1 1003 0.1511
B 1 1004 0.1999
B 1 1005 0.2011
B 1 1006 0.1878
B 1 1007 0.1999
C 1 1008 0.5321
C 1 1009 0.5333
C 1 1010 0.5445
C 1 1011 0.5655
C 1 1012 0.5852
A 1 1013 0.2788
A 1 1014 0.2899
A 1 1015 0.2901
A 1 1016 0.2921
A 1 1017 0.2877
A 1 1018 0.2896
對于此檔案,“ABC”列將始終只等于 A、B 或 C。
我想要做的是對每組 A、B 和 C 的 Param1 數進行平均。因此,在上面的示例中,我希望獲得 Param1 的平均值,當它等于 A 從 Ft 1000 到 1003 時,當它從 Ft 1004 到 1007 等于 B,從 Ft 1008 到 1012 等于 C,從 1013 到 1018 等于 A,依此類推。
編輯我還應該提到,在這些檔案中,ABC 通常會在數百行中等于相同的值,直到它等于另一個值,該值將再次重復數百行,依此類推。所以“ABC”列的值可能是這樣的:
AAA...AAA BBB...BBB CCC...CCC BBB...BBB AAA...AAA
我一直在研究 for 回圈的使用,如下所示,但問題是我得到了 Param1 在整整一英里內等于 A 時的所有平均值,而不是每個分組。這是我到目前為止所擁有的:
for i in range(1,df['Mile'].max()):
avg_p1 = df.loc[(df['Mile'] == i) & (df['ABC'] =='A'), 'Param1'].mean()
print(avg_p1)
但在這種情況下,當 ABC = A 時,我得到了 Param1 的平均值。在上面的表格示例中,當 ABC = A 從 Ft 1000 到 1003 和 1013 到 1018 時,我想要 Param1 的平均值,作為在整個檔案中重復的單獨平均值。
是否需要在上面的現有回圈中添加第二個 for 回圈或某種 if/else 條件?對這位新手程式員的任何幫助將不勝感激:)
uj5u.com熱心網友回復:
謝謝你提出這個有趣的問題。
這個想法是為每個連續值“A”、“B”或“C”創建一個組,直到它發生變化。我還假設您的資料已經按英里排序
df['change'] = np.where(df['ABC']!=df['ABC'].shift(1),1.0,0.0)
現在您只需cumsum創建新的組指標
df['gr'] = df['change'].cumsum()
現在一切都應該沒問題,你可以用它groupby來得到你想要的
df.groupby('gr')['Param1'].mean().reset_index()
uj5u.com熱心網友回復:
df.groupby('ABC')['Ft'].mean()
輸出:
ABC
A 1009.9
B 1005.5
C 1010.0
Name: Ft, dtype: float64
uj5u.com熱心網友回復:
首先,獲取每個類別的 bin 串列,然后您可以按類別和 bin 進行平均......像這樣:
results = {}
for cat in df['ABC'].unique():
results[cat] = []
category_index = df[df['ABC'] == cat].index.to_series()
# Get list of continuous indexes
bins = category_index.groupby(
category_index.diff().ne(1).cumsum()
).agg(['first','last']).apply(tuple,1).tolist()
# Average by category and bin
for bin in bins:
bin_low, bin_high = bin
df_cut = df.iloc[bin_low:bin_high]
low_ft, high_ft = df.iloc[bin_low]['Ft'], df.iloc[bin_high]['Ft']
average_value = df_cut.groupby('ABC').mean()['Param1'][cat]
results[cat].append(((low_ft, high_ft), average_value))
results
輸出:
{
'A': [
((1000, 1003), 0.11886666666666668),
((1013, 1018), 0.28772000000000003)
],
'B': [
((1004, 1007), 0.19626666666666667)
],
'C': [
((1008, 1012), 0.54385)
]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/536599.html
