Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用自定义函数指定groupby以数组形式返回列值_Python_Pandas_Group By_Aggregate - Fatal编程技术网

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'])