Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.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 将具有特定索引的所有行移动到一行中_Python_Sql_Sql Server_Pandas - Fatal编程技术网

Python 将具有特定索引的所有行移动到一行中

Python 将具有特定索引的所有行移动到一行中,python,sql,sql-server,pandas,Python,Sql,Sql Server,Pandas,我有一个表,其结构如下所示,每个组索引的行数未知 Group || PropertyA || PropertyB || PropertyC ============================================ 1 || x1 || x12 || x13 2 || x21 || x23 || x23 3 || x31 || x32 || x33 3 ||

我有一个表,其结构如下所示,每个组索引的行数未知

Group || PropertyA || PropertyB || PropertyC
============================================
  1   ||   x1      ||    x12    ||    x13
  2   ||   x21     ||    x23    ||    x23
  3   ||   x31     ||    x32    ||    x33
  3   ||   x41     ||    x42    ||    x43
 ...       ...           ...          ...
我希望具有相同组索引的所有行都位于一行中,并连接在一起,如下所示:

Group || PropertyA || PropertyB || PropertyC || PropertyA1 || PropertyB1 || PropertyC1 ...
==================================================================================
  1   ||   x1      ||    x12    ||    x13    ||   NULL    ||   NULL    ||  NULL
  2   ||   x21     ||    x23    ||    x23    ||   NULL    ||   NULL    ||  NULL
  3   ||   x31     ||    x32    ||    x33    ||   x41     ||    x42    ||   x43

 ...       ...           ...          ...
我尝试过使用动态SQL,也尝试过使用pandas pandas.pivot()和pandas.pivot_table(),但到目前为止,我在这两方面的技能都失败了。我可以访问的数据库是SQL Server

这个问题是我试图添加未知数量的列,因为组索引可能会出现多次

任何与结果接近的东西都会有很大的帮助——列名并不重要,可以简单地重复。我只需要将每组的所有数据放在一长行中

非常感谢您的帮助。

我们可以使用 并从末尾的列中删除多索引

new_df = (df.pivot_table(index='Group', 
                         columns=df.groupby('Group').cumcount(),
                         aggfunc='first')
            .sort_index(axis=1, level=1))
new_df = new_df.set_axis([f'{x}{y}' if y != 0 else x 
                           for x, y in new_df.columns],
                           axis=1).reset_index()
print(new_df)
输出

   Group PropertyA PropertyB PropertyC PropertyA1 PropertyB1 PropertyC1
0      1        x1       x12       x13        NaN        NaN        NaN
1      2       x21       x23       x23        NaN        NaN        NaN
2      3       x31       x32       x33        x41        x42        x43
请注意,
aggfunc='first'
只是简单地使用了,这样它就不会使用带有str值的np.mean(默认aggfunc)失败。使用cumcount时,此方法不会丢失数据帧中的信息

如果您想了解更多有关pivot的信息,可以阅读。您的问题类似于问题10


出于两个原因,我决定不再重复这个问题。一个是
ìnsert
是不必要的,另一个是这里您必须以某种不同的方式更改列的名称

这将取决于您需要最终结果的格式—如果您计划更改SQL Server上的数据库—您必须使用SQL“ALTER TABLE”来添加列。SQL表需要有一定数量的列-这可能不是个好主意

但是,如果您只是获取数据,并且希望在python中以另一种方式使用它,那么可以在列表中非常轻松地对其进行操作。如果您的数据是一个二维列表(列表列表),那么每个列表都可以是可变长度的

output_table = []
groups = []
for row in table:
    if row[0] in groups:
        row_to_extend = next(line for line in output_table if line[0] == row[0])
        row_to_extend.extend(row)
    else:
        groups.append(row[0])
        output_table.append(row)

我们有熊猫的方法,它们被创造来完成这项任务。。。我认为这里使用循环的速度很慢,而且语法更难理解,因为使用循环来构建数据帧。每个模块都有自己的功能——我个人尽量不调用不必要的模块。名称空间的可读性很好,但对我来说,逻辑可读性更好——wysiwyg。只要检查两种方法(为了得到精确的解决方案)在不同数据帧上所花费的时间,你就会发现它们的方法要慢得多。Pandas方法显然像任何代码一样使用循环,但不使用外部循环。它们是在numpy上优化的,显然使用它们是合乎逻辑的。我个人尝试不调用模块,如果它不是必需的,您甚至可能不需要使用python。但是python的使用是有原因的。熊猫也是如此。我个人尽量不在循环中使用
if-else
编写代码,如果没有必要的话。如果不包括Pandas创建数据帧所需的时间,Pandas在数据帧上运行所需的时间是不可比的。感谢您的精彩回答!更改的列名非常有帮助。