如何在数据帧中两个连续位置对信息求和



我有一个熊猫数据帧,位置,k,y。例如

pos k y
123 0.7 0.5
124 0.4 0.1
125 0.3 0.2
126 0.4 0.1
128 0.3 0.6
130 0.4 0.9
131 0.3 0.2

我想总结 k 和 y 处的信息,例如

123 1.1 0.6
125 0.7 0.3
128 0.3 0.6
130 0.7 1.1

因此,输出只有第一个位置,值的总和是第一个,其紧随其后的连续数字。

我尝试按熊猫分组

for k,g in df.groupby(df['pos'] - np.arange(df.shape[0])):
   u=g.ix[0:,2:].sum()

但它组所有我不想要的连续数字

我也需要一些快速的东西,因为我的数据文件中有2611774行

希望这能解决你的问题

import pandas as pd
df = pd.DataFrame( columns=['pos','k','y'])
cf = pd.DataFrame( columns=['pos','k','y'])
df['pos']=123, 124,125,126,128,130,131
df['k']=.7,.4,.3,.4,.3,.4,.3
df['y']=.5,.1,.2,.1,.6,.9,.2
row=0
while 1:
    if row+1<len(df):
        if(df.loc[row]['pos']+1==df.loc[row+1]['pos']):
            cf.loc[row]= df.loc[row]+df.loc[row+1]
            cf.loc[row]['pos']=df.loc[row]['pos']
            row=row+2
        else:
            cf.loc[row]= df.loc[row]
            row=row+1
    else:
        break
print cf

也许这比循环更快,但它不会像我认为你期望的那样对位置 123 和 124 然后是 130 和 131 求和,因为它将奇数位置与连续的 129 和 130、131 和 132 相加......

df = df.set_index('pos')
df_odd = df.loc[df.index.values % 2 == 1]
df_even = df.loc[df.index.values % 2 == 0]
df_even = df_even.set_index(df_even.index.values - 1)
df_odd.add(df_even, fill_value = 0)

结果:

pos k   y
123 1.1 0.6
125 0.7 0.3
127 0.3 0.6
129 0.4 0.9
131 0.3 0.2

我以前没有使用过熊猫,但是如果您有机会将数据用作列表,那么这应该可以工作。

def SumNext(L):
  N = xrange(len(L)-1)
  Output = [L[i]+L[i+1] for i in N]
  return Output

如果您输入列表,此函数将为您提供连续元素的总和。

A=[1,1,2,3,5,8,13]总和下一个(A) => [2,3,5,8,13]

然后,您只需要将值读出到您喜欢的任何位置,当您获得大量元素时,在列表中执行操作(而不是 while 循环)要快得多。

然后,您只需要弄清楚将输出传递回数据框的实现。

最新更新