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在数据帧上运行所需的时间是不可比的。感谢您的精彩回答!更改的列名非常有帮助。