我有一个熊猫数据帧,位置,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 循环)要快得多。
然后,您只需要弄清楚将输出传递回数据框的实现。