【问题标题】:Finding mean of three columns at a time in Pandas DataFrame在 Pandas DataFrame 中一次查找三列的平均值
【发布时间】:2017-04-15 03:26:01
【问题描述】:

我有一个 10000 行和 200 列的数据框; 'df'。所有列都是数字。例如,我需要一次找到三列的平均值;前三列的平均值(0:3),然后是接下来三列的平均值(3:6),依此类推。最后,我将得到 67 列。但我需要索引与原始索引相同。 这是我的方法:

l1=list(np.arange(0,200,3))

def func4(row):
    data=row[0:200]

  for i in l1:
     if i!=198:
        dat1=data[i:i+3]
        np.mean(dat1)

    else:
        i=i-1
        dat1=data[i:i+3]
        np.mean(dat1)
return row

df.apply(func4,axis=1)

但这是我得到的错误,我理解,但我无法纠正它:

ValueError: 传递值的形状是 (1, 67),索引意味着 (1, 200) 非常感谢您的帮助。谢谢

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

这应该可行:

# I am creating a random dataframe to test
df=pd.DataFrame(np.random.randint(1,10,(1000,200)))

# Use list comprehension to create list of 3 column means then concatenate all
# I am using `df.ix` to take 3-column slices
pd.concat([df.ix[:,i:i+3].mean(axis=1) for i in range(0,len(df.columns),3)], axis=1)

【讨论】:

  • 谢谢先生。非常感谢您的帮助。你能再告诉我一个矢量化问题吗?假设新的数据帧 df_new 现在有 67 列,因为我们一次取三列的平均值。我想为 df_new 的列提供新标签。这是我的方法。感谢您对改进的反馈。
  • l3=np.arange(2000,2017) l3=list(l3) l4=['q1','q2','q3','q4'] l5new=[] for i in l3: for j in l4: k=str(i)+j l5new.append(k) idx=df_new.columns.tolist() for i in idx: df_new = df_new.rename(columns={i:l5new[i]}) 你可以看到我在这里使用 for 循环,这很乏味。
  • 如果你想改变列名,你可以这样做:df_new.columns=['Col1', 'Col2', 'Col3' .....]。如果您只想更改几列的名称,使用df.rename 将是一个更好的解决方案。见here
猜你喜欢
  • 2017-04-19
  • 2023-02-09
  • 1970-01-01
  • 2013-09-12
  • 2021-05-05
  • 1970-01-01
相关资源
最近更新 更多