巴迪:我有一份数据,就像:
df = pd.DataFrame({'code':'A','A','A','A','A','A','B','B','B', 'B','B','B'), 'Times': (1,2,3,4,5,6,1,2,3,4,5,6),'Figure':(2.3,4.1,5.2,7.0,1.8,9.0,4.2,7.9,4.6,1.4,9.7,1.2)})所以这样的结构:
>>> df
Figure Times code
0 2.3 1 A
1 4.1 2 A
2 5.2 3 A
3 7.0 4 A
4 1.8 5 A
5 9.0 6 A
6 4.2 1 B
7 7.9 2 B
8 4.6 3 B
9 1.4 4 B
10 9.7 5 B
11 1.2 6 B现在我想在每个代码组('A','B')中,只计算[4,1,6,1,3,2]中的Times对时的数字差异。因此,所需的新数据格式将如下所示:
>>> newdf
code diffFigure diffTimes
0 A 4.7 4-1
1 A 6.7 3-2
2 A 1.1 6-1
3 B -3.3 4-1
4 B -2.8 3-2
5 B -3.0 6-1当然,我想使用groupby函数并应用一个函数:
def f(x):
myList = [[4,1],[6,1],[3,2]]
for i in x.itertuples():
for j in x.itertuples():
if (i.Times, j.Times) in myList:
print (i.code + ": " + str(i.Times) + "-" + str(j.Times) + "=" + str(i.Figure - j.Figure))
newdf = df.groupby('code').apply(f)但我无法得到想要的数据。这里有两个问题:首先,是否有可能不使用迭代来枚举所有行?其次,在函数f中,如何设计返回格式以得到所需的数据?
非常感谢
发布于 2017-07-07 04:06:46
有两种可能的解决办法:
要么利用.unstack()
df = pd.DataFrame({'code':('A','A','A','A','A','A','B','B','B', 'B','B','B'), 'Times': (1,2,3,4,5,6,1,2,3,4,5,6),'Figure':(2.3,4.1,5.2,7.0,1.8,9.0,4.2,7.9,4.6,1.4,9.7,1.2)})
df = df.set_index(["code","Times"]).unstack()并手动连接for循环中的差异,即:
myList = [[4,1],[6,1],[3,2]]
pd.concat(((df[('Figure',d1)] - df[('Figure',d0)]).to_frame('diffFigure').assign(diffTimes="{}-{}".format(d1,d0)) for (d1,d0) in myList))或列出每个代码中所有可能的组合:
df0 = df.merge(df, on = 'code')然后,通过将myList转换为dataframe并执行内部连接操作,获取myList中的对子集:
df0 = df0.merge(pd.DataFrame(myList, columns = ['Times_x','Times_y']))
df0['diffFigure'] = df0.Figure_x - df0.Figure_y
df0['diffTimes'] = df0.Times_x.astype(str) + '-' + df0.Times_y.astype(str)
df0[['code','diffFigure','diffTimes']]https://stackoverflow.com/questions/44961976
复制相似问题