Python 基于列名的数据帧条件平均值
从数据帧的示例开始,最容易解释:Python 基于列名的数据帧条件平均值,python,pandas,dataframe,mean,Python,Pandas,Dataframe,Mean,从数据帧的示例开始,最容易解释: 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
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
所以,我想看看列名值,如果它们在整数之前是相同的,我希望输出列具有每个时间索引值的值的平均值
我的想法是使用df.round将列标题四舍五入到最接近的整数,然后使用.mean()以某种方式将轴上的平均值=0应用于相同的列标题。但是,我在数据帧索引类型上使用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
获取列的意思:
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
使用
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
另一种方法是通过
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
对如果您需要回答中的澄清,请询问。谢谢。唉,这个用户也是这样。先接受我的答案,然后取消接受。@cᴏʟᴅsᴘᴇᴇᴅ 我还是喜欢你的解决方案~:-)行动是变化无常的野兽。“他们不知道自己想要什么。”大脑溢出,这是一年后的问题。。LOL这个问题太老了,在我看来没有悬赏。所描述的解决方案是有效的。这只是将它分割,而不是将它包围!这里的输出与问题的期望输出相匹配。如果不是这样,你在寻找什么?@Brain_溢出它与你发布的预期输出完全相同。如果出现问题,你必须解释原因。我建议在把答案写下来之前先尝试一下……为什么这样更好?我非常怀疑。请不要草率行事,你无法决定你的解决方案是否更好。让OP和选民来决定吧。也不要乞求投票,这是糟糕的形式。谢谢@coldspeed,我会记住这件事:)抱歉耽搁了