Python 将多个列连接到多行中

Python 将多个列连接到多行中,python,pandas,dataframe,sqlite,Python,Pandas,Dataframe,Sqlite,我有一个熊猫数据框。我想基于一个带有标识符的列连接多个列。可能有多行列需要连接。我只使用字符串 例如,我有一个数据集,如下所示: Identifier Op1 Op2 Op3 A str_1 str_2 str_3 B str_4 str_5 str_6 B str_7 str_8 str_9 B str_10 str_11 str_12 C str_13 str_14 str_15 C

我有一个熊猫数据框。我想基于一个带有标识符的列连接多个列。可能有多行列需要连接。我只使用字符串

例如,我有一个数据集,如下所示:

 Identifier     Op1 Op2 Op3
 A     str_1    str_2   str_3
 B     str_4    str_5   str_6
 B     str_7    str_8   str_9
 B     str_10   str_11  str_12
 C     str_13   str_14  str_15 
 C     str_16   str_17  str_18
 Identifier Ops
 A  str_1 str_2 str_3
 B  str_4 str_5 str_6 str_7 str_8 str_9 str_10 str_11 str_12
 C  str_13 str_14 str_15 str_16 str_17 str_18
我需要将Op1、Op2和Op3中的每个人连接起来。如果同一标识符位于多行上,则需要连接Op1、Op2和Op3列,然后与第一列连接

所以我的最终结果应该是这样的:

 Identifier     Op1 Op2 Op3
 A     str_1    str_2   str_3
 B     str_4    str_5   str_6
 B     str_7    str_8   str_9
 B     str_10   str_11  str_12
 C     str_13   str_14  str_15 
 C     str_16   str_17  str_18
 Identifier Ops
 A  str_1 str_2 str_3
 B  str_4 str_5 str_6 str_7 str_8 str_9 str_10 str_11 str_12
 C  str_13 str_14 str_15 str_16 str_17 str_18
每件东西之间也应该有一个空间。所以像'str_8 str_9'而不是'str_8 str_9'

我在sqlite3中也有这个表,如果它比pandas更容易使用的话

我该怎么做


谢谢

使用名为df的输入数据帧,请尝试以下操作:

from itertools import chain
df.groupby('Identifier')['Op1', 'Op2', 'Op3']\
  .apply(lambda x: ' '.join(list(chain(*x.values.tolist()))))\
  .reset_index()\
  .rename(columns={0:'Ops'})

使用名为df的输入数据帧,尝试以下操作:

from itertools import chain
df.groupby('Identifier')['Op1', 'Op2', 'Op3']\
  .apply(lambda x: ' '.join(list(chain(*x.values.tolist()))))\
  .reset_index()\
  .rename(columns={0:'Ops'})

将输入数据转换为csv文件,我做了以下工作,效果很好

import pandas as pd

DF = pd.read_csv("CombinerData.csv")

print DF
print 

def combine_Columns_Into_New_Column(DF, columns_To_Combine, new_Column_Name):
    DF[new_Column_Name] = ''
    for Col in columns_To_Combine:
        DF[new_Column_Name] += DF[Col].map(str) + ' '
    DF = DF.drop(columns_To_Combine, axis=1)
    DF = DF.groupby(by=['Identifier']).sum()

    return DF

DF = combine_Columns_Into_New_Column(DF, ['Op1','Op2','Op3'],'Ops')

print DF
输出:

                                                          Ops
Identifier                                                   
A                                          str_1 str_2 str_3 
B           str_4 str_5 str_6 str_7 str_8 str_9 str_10 str...
C                 str_13 str_14 str_15  str_16 str_17 str_18 
输入文件:

Identifier,Op1,Op2,Op3
A,str_1,str_2,str_3
B,str_4,str_5,str_6
B,str_7,str_8,str_9
B,str_10,str_11,str_12
C,str_13,str_14,str_15 
C,str_16,str_17,str_18

将输入数据转换为csv文件,我做了以下工作,效果很好

import pandas as pd

DF = pd.read_csv("CombinerData.csv")

print DF
print 

def combine_Columns_Into_New_Column(DF, columns_To_Combine, new_Column_Name):
    DF[new_Column_Name] = ''
    for Col in columns_To_Combine:
        DF[new_Column_Name] += DF[Col].map(str) + ' '
    DF = DF.drop(columns_To_Combine, axis=1)
    DF = DF.groupby(by=['Identifier']).sum()

    return DF

DF = combine_Columns_Into_New_Column(DF, ['Op1','Op2','Op3'],'Ops')

print DF
输出:

                                                          Ops
Identifier                                                   
A                                          str_1 str_2 str_3 
B           str_4 str_5 str_6 str_7 str_8 str_9 str_10 str...
C                 str_13 str_14 str_15  str_16 str_17 str_18 
输入文件:

Identifier,Op1,Op2,Op3
A,str_1,str_2,str_3
B,str_4,str_5,str_6
B,str_7,str_8,str_9
B,str_10,str_11,str_12
C,str_13,str_14,str_15 
C,str_16,str_17,str_18


我正在尝试此解决方案-我得到的错误是“DataFrame”对象没有属性“agg”。我正在使用python 2.7。@如果您的Pandas版本<0.20.0,它将无法工作。尝试升级Pandas或使用@ags29的解决方案我正在尝试此解决方案-我得到的错误是“DataFrame”对象没有属性“agg”。我正在使用python 2.7。@如果您的Pandas版本<0.20.0,它将无法工作。尝试升级Pandas或使用@ags29的解决方案,直到重置索引为止。然后我得到了以下错误:AttributeError:无法访问“DataFrameGroupBy”对象的可调用属性“reset_index”,请尝试使用“apply”方法。我通过运行两次groupby来复制该错误,例如df.groupby…[…]groupby…,因此可能需要再次检查您是否没有这样做。否则代码似乎对我有效。我再次尝试,并确认我没有执行您描述的错误。到目前为止,我所做的唯一更改是将groupby设置为df2。如果重要的话,我的实际数据集中的列比我在上面示例中描述的要多。我不能做你的最后两个步骤中的任何一个-我得到的错误都是一样的。我得到的是重置索引。然后我得到了以下错误:AttributeError:无法访问“DataFrameGroupBy”对象的可调用属性“reset_index”,请尝试使用“apply”方法。我通过运行两次groupby来复制该错误,例如df.groupby…[…]groupby…,因此可能需要再次检查您是否没有这样做。否则代码似乎对我有效。我再次尝试,并确认我没有执行您描述的错误。到目前为止,我所做的唯一更改是将groupby设置为df2。如果重要的话,我的实际数据集中的列比我在上面示例中描述的要多。我不能做你的最后两个步骤中的任何一个-我得到的错误都是一样的。这几乎对我有效。但是新的DF没有附加新的列?我该如何修复它?@ifthenifthen,我再次运行它,就像我发布它一样,并且它按照我报告的那样工作。我正在使用python 2.7。仔细检查您的代码和输入文件。如果您将代码和输入放在某个远程git repo中,我可以帮助您进行故障排除。我还在上面的编辑中添加了输入文件结构。我的实际输入文件中是否有其他列会有关系吗?如果我完全按照您上面所写的方式运行它,但有以下更改:DF2=将列合并到新的列DF、['Op1'、'Op2'、'Op3']、'Ops',然后DF2显示我的输入文件,其中缺少要合并的列,没有额外的栏目。但是DF显示了一个额外的列,没有删除列,但是没有聚合多行。因此,它的工作原理类似于标识符A,而不是标识符B。如果我首先将其设置为等于DF,则只需删除列,并且没有额外的列。请按照此->的第一个答案的说明并报告您的熊猫版本,好吗?这几乎适用于我。但是新的DF没有附加新的列?我该如何修复它?@ifthenifthen,我再次运行它,就像我发布它一样,并且它按照我报告的那样工作。我正在使用python 2.7。仔细检查您的代码和输入文件。如果您将代码和输入放在某个远程git repo中,我可以帮助您进行故障排除。我还在上面的编辑中添加了输入文件结构。我的实际输入文件中是否有其他列会有关系吗?如果我完全按照您上面所写的方式运行它,但有以下更改:DF2=将列合并到新的列DF、['Op1'、'Op2'、'Op3']、'Ops',然后DF2显示我的输入文件,其中缺少要合并的列,没有额外的栏目。但是DF显示了一个额外的列,没有删除列,但是没有聚合多行。它的工作原理与标识符A类似,但与标识符B不同。如果我首先将其设置为等于DF,那么
只需删除列,没有额外的列。请按照此->的第一个答案的说明并报告您的版本,好吗?