[英]Pandas dataframe conditional mean based on column names
從數據幀的樣本開始,這將是最簡單的解釋:
TimeStamp 382.098 382.461 383.185 383.548
10:28:00 0.012448 0.012362 0.0124485 0.012362
10:30:00 0.0124135 0.0123965 0.0124135 0.012431
10:32:00 0.0551035 0.0551725 0.055931 0.0563105
10:34:00 0.055586 0.0557245 0.056655 0.0569485
10:36:00 0.055586 0.055776 0.0568105 0.057362
我希望我的輸出是:
TimeStamp 382 383
10:28:00 0.012405 0.01240525
10:30:00 0.012405 0.01242225
10:32:00 0.05513 0.05612075
10:34:00 0.05565525 0.05680175
10:36:00 0.055681 0.05708625
因此,我想查看列名稱值,如果它們等於整數,則希望輸出col具有每個時間索引值的平均值。
我的想法是使用df.round將列標題四舍五入到最接近的整數,然后使用.mean()以某種方式將平均值= 0應用於相同的col標題。 但是,在數據框索引類型上使用round函數時出現錯誤。
編輯:根據答案,我用
df.rename(columns=dict(zip(df.columns[0:], df.columns[0:]\
.values.astype(float).round().astype(str))),inplace=True)
df = df.groupby(df.columns[0:], axis=1).mean()
而且它弄亂了列名和值,而不是給我基於列名的平均值……不知道為什么!
沿第一軸使用groupby
並使用lambda
。
df.set_index('TimeStamp', inplace=True)
df.groupby(by=lambda x: int(x.split('.')[0]), axis=1).mean()
382 383
TimeStamp
10:28:00 0.012405 0.012405
10:30:00 0.012405 0.012422
10:32:00 0.055138 0.056121
10:34:00 0.055655 0.056802
10:36:00 0.055681 0.057086
使用類型轉換重命名列,將TimeStamp
移至索引,然后使用groupby
獲取列的含義:
df.rename(columns=lambda x: int(float(x)) if x!="TimeStamp" else x, inplace=True)
df.set_index("TimeStamp", inplace=True)
df
382 382 383 383
TimeStamp
10:28:00 0.012448 0.012362 0.012448 0.012362
10:30:00 0.012414 0.012396 0.012414 0.012431
10:32:00 0.055103 0.055172 0.055931 0.056310
10:34:00 0.055586 0.055725 0.056655 0.056948
10:36:00 0.055586 0.055776 0.056810 0.057362
df.groupby(df.columns, axis=1).mean()
382 383
TimeStamp
10:28:00 0.012405 0.012405
10:30:00 0.012405 0.012422
10:32:00 0.055138 0.056121
10:34:00 0.055655 0.056802
10:36:00 0.055681 0.057086
使用np.floor
rename
和groupby
df.rename(columns=dict(zip(df.columns[1:], np.floor(df.columns[1:].values.astype(float)).astype(str))),inplace=True)
df.set_index('TimeStamp').groupby(level=0,axis=1).mean().reset_index()
Out[171]:
TimeStamp 382.0 383.0
0 10:28:00 0.012405 0.012405
1 10:30:00 0.012405 0.012422
2 10:32:00 0.055138 0.056121
3 10:34:00 0.055655 0.056802
4 10:36:00 0.055681 0.057086
另一種方法是通過pd.to_numeric
,只是@coldspeed答案的一個細微變化,即
df = df.set_index('TimeStamp')
df.groupby(pd.to_numeric(df.columns).astype(int),1).mean()
382 383
TimeStamp
10:28:00 0.012405 0.012405
10:30:00 0.012405 0.012422
10:32:00 0.055138 0.056121
10:34:00 0.055655 0.056802
10:36:00 0.055681 0.057086
廣義解
df = pd.DataFrame({383.045:[1,2], 383.96:[3,4], 383.78:[5,5], 343:[9,11]})
df.columns = [int(i) for i in df.columns]
for i in set(df.columns):
if len(df[i].shape) == 2:
mean = df[i].T.sum()/float(df[i].shape[1])
df = df.drop([i],1)
df[i] = mean
要將列值四舍五入到最接近的整數,可以對列表理解進行分組,該理解將每列(除第一列即TimeStamp
)四舍五入到最接近的整數,然后采用整數:
>>> (df
.set_index('TimeStamp')
.groupby([int(round(col, 0)) for col in df.columns[1:].astype(float)], axis=1)
.mean())
382 383 384
TimeStamp
10:28:00 0.012405 0.012448 0.012362
10:30:00 0.012405 0.012414 0.012431
10:32:00 0.055138 0.055931 0.056310
10:34:00 0.055655 0.056655 0.056948
10:36:00 0.055681 0.056810 0.057362
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.