Python 使用自定义函数指定groupby以数组形式返回列值
我一定是做错了什么,但即使经过了重大考验,我也不知道我做错了什么 数据:Python 使用自定义函数指定groupby以数组形式返回列值,python,pandas,group-by,aggregate,Python,Pandas,Group By,Aggregate,我一定是做错了什么,但即使经过了重大考验,我也不知道我做错了什么 数据: df=pd.DataFrame({ “ID”:[3,3,3,2,2,2,1,1], “X”:[10,11,12,20,21,30,31,32], “Y”:[100110120200210300310320] }) #产出: ID X Y 0 3 10 100 1 3 11 110 2 3 12 120 3 2 20 200 4 2 21 210 5 2 30 300 6
df=pd.DataFrame({
“ID”:[3,3,3,2,2,2,1,1],
“X”:[10,11,12,20,21,30,31,32],
“Y”:[100110120200210300310320]
})
#产出:
ID X Y
0 3 10 100
1 3 11 110
2 3 12 120
3 2 20 200
4 2 21 210
5 2 30 300
6 1 31 310
7 1 32 320
这是我的聚合函数。(逗号分隔的值工作正常)
def列到数组(数据):
#数据['Xs']=“,”.join(在数据['X']中用str(d)表示d)#
#数据['Ys']=“,”。连接(str(d)表示数据['Y']中的d)#
#接下来的两行导致:值的长度和索引的长度不匹配
#哪种是有意义的。
#数据['Xs']=[数据['X'].值]
#数据['Y']=[数据['Y'].值]
#但这为什么不起作用呢
#np.tile正在生成相同数量的数组数据
data['Xs']=np.tile([data['X'].values],(data.shape[0],1))
data['Ys']=np.tile([data['Y'].values],(data.shape[0],1))
返回数据
我是这样分组的:
df=df.groupby(['ID'])。应用(\u column\u to\u数组)
##输出为:
ID X Y Xs Ys
0 3 10 100 10 10
1 3 11 110 10 10
2 3 12 120 10 10
3 2 20 200 20 20
4 2 21 210 20 20
5 2 30 300 20 20
6 1 31 310 31 31
7 1 32 320 31 31
我期待或试图得到的是这样的东西。其中X/Y列的值可以作为数组捕获
ID X Y Xs Ys
0 3 10 100 [10,11,12] [100,110,120]
1 3 11 110 [10,11,12] [100,110,120]
2 3 12 120 [10,11,12] [100,110,120]
3 2 20 200 [20,21,30] [200,210,300]
4 2 21 210 [20,21,30] [200,210,300]
5 2 30 300 [20,21,30] [200,210,300]
6 1 31 310 [31,32] [310,320]
7 1 32 320 [31,32] [310,320]
与as一起使用:
您的方法是正确的,但这里的问题是熊猫通常不能很好地处理对象列(包括列表和类似列表的类型)。它在内部使用特殊的numpy数组,因此您只能先使用
.tolist()
将列转换为列表,然后再将列分配回:
然后你的代码工作:
df.groupby(['ID']).apply(_colum_to_array)
ID X Y Xs Ys
0 3 10 100 [10, 11, 12] [100, 110, 120]
1 3 11 110 [10, 11, 12] [100, 110, 120]
2 3 12 120 [10, 11, 12] [100, 110, 120]
3 2 20 200 [20, 21, 30] [200, 210, 300]
4 2 21 210 [20, 21, 30] [200, 210, 300]
5 2 30 300 [20, 21, 30] [200, 210, 300]
6 1 31 310 [31, 32] [310, 320]
7 1 32 320 [31, 32] [310, 320]
说明:“x”将具有列表值“Xs”,“y”将具有列表值“Ys”。现在将这两个数据帧与原始数据帧df合并,并为“x”和“y”添加后缀“s”,这两个数据帧与内部merge语句合并为一个感谢您解释我丢失的地方。知道额外的信息总是好的。
def _colum_to_array(data):
data['Xs'] = np.tile([data['X'].values], (data.shape[0], 1)).tolist()
data['Ys'] = np.tile([data['Y'].values], (data.shape[0], 1)).tolist()
return data
df.groupby(['ID']).apply(_colum_to_array)
ID X Y Xs Ys
0 3 10 100 [10, 11, 12] [100, 110, 120]
1 3 11 110 [10, 11, 12] [100, 110, 120]
2 3 12 120 [10, 11, 12] [100, 110, 120]
3 2 20 200 [20, 21, 30] [200, 210, 300]
4 2 21 210 [20, 21, 30] [200, 210, 300]
5 2 30 300 [20, 21, 30] [200, 210, 300]
6 1 31 310 [31, 32] [310, 320]
7 1 32 320 [31, 32] [310, 320]
x=df.groupby(['ID'])['X'].apply(list).reset_index()
y=df.groupby(['ID'])['Y'].apply(list).reset_index()
pd.merge(df,pd.merge(x,y,left_on='ID',right_on='ID'),left_on='ID',right_on='ID',suffixes=['','s'])